В следующем коде я получаю АССЕРТ в 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--;
}