QMutex заблокирован неизвестным потоком - PullRequest
0 голосов
/ 19 июня 2020

В следующем коде я получаю АССЕРТ в unlock (), потому что lockThreads (a QList<QThread*>) не содержит разблокирующего (текущего) потока. Исследуя lockThreads, я обнаружил поток "ntdll", который я понятия не имею, что он делает, и доступен только дизассемблер, который не предоставляет полезной информации. Проблему очень сложно воспроизвести, поэтому спасибо за любой намек (возможно, это глупый поворот в этом логе c).

Изменить: мьютекс рекурсивен.

MyMutex::MyMutex (QMutex::RecursionMode mode)
: QMutex (mode)
, lockCount (0)
{
}

MyMutex::~MyMutex ()
{
    ASSERT (lockingThreads.isEmpty ());
}

void MyMutex::lock ()
{
    lockCount++;
#if MYDEBUG
    // grab thread before lock so we can identify it if it deadlocks here
    QThread* thread = QThread::currentThread ();
    if (!isRecursive ())
    {
        ASSERT (!lockingThreads.contains (thread));
        if (!lockingThreads.contains (thread))
            lockingThreads += thread;
    }
    else
        lockingThreads += thread;
#endif

    QMutex::lock ();
}

void MyMutex::unlock ()
{
#if MYDEBUG
    QThread* thread = QThread::currentThread ();
    ASSERT (lockingThreads.contains (thread));
    lockingThreads.removeOne (thread);
    if (lockingThreads.contains (thread) && !isRecursive ())
        ASSERTFALSE;
#endif
    QMutex::unlock ();
    lockCount--;
}
...