我正在GDB中运行我的程序。我的程序需要为其工作创建16个线程。所有这些工作都很好。最后我得到的错误QMutex::lock: Deadlock detected in thread 0xfe8
这里是GDB输出QMutex :: lock:线程中检测到死锁0xfe8(主线程?)
(gdb) run
Starting program: C:\dgrfb.run\client/DGRFB.exe
[New thread 4076.0xfe8]
[New thread 4076.0x368]
warning: >> Socket State Changed: QAbstractSocket::HostLookupState
warning: >> Socket State Changed: QAbstractSocket::ConnectingState
[New thread 4076.0x4b8]
warning: >> Socket State Changed: QAbstractSocket::ConnectedState
[New thread 4076.0x49c]
warning: Rect Area 0 2 DG::UpdateThread(0xa0d5220)
warning: Rect Area 0 3 DG::UpdateThread(0xa0d5548)
warning: Rect Area 1 0 DG::UpdateThread(0xa0d5870)
warning: Rect Area 1 1 DG::UpdateThread(0xa0d5b98)
warning: Rect Area 1 2 DG::UpdateThread(0xa0d5ec0)
warning: Rect Area 1 3 DG::UpdateThread(0xa0d61e8)
warning: Rect Area 2 0 DG::UpdateThread(0xa0d6510)
warning: Rect Area 2 1 DG::UpdateThread(0xa0d6838)
warning: Rect Area 2 2 DG::UpdateThread(0xa0d6b60)
warning: Rect Area 2 3 DG::UpdateThread(0xa0d6e88)
[New thread 4076.0x540]
warning: Rect Area 3 0 DG::UpdateThread(0xa0d71b0)
warning: Rect Area 3 1 DG::UpdateThread(0xa0d7568)
warning: Rect Area 3 2 DG::UpdateThread(0xa0d7cc0)
warning: Rect Area 3 3 DG::UpdateThread(0xa0d7fe8)
[New thread 4076.0x670]
[New thread 4076.0x6dc]
[New thread 4076.0x674]
[New thread 4076.0x3ac]
[New thread 4076.0x684]
[New thread 4076.0x434]
[New thread 4076.0x44c]
[New thread 4076.0x7e8]
[New thread 4076.0x408]
[New thread 4076.0x7e0]
[New thread 4076.0x42c]
[New thread 4076.0x814]
[New thread 4076.0x6f8]
[New thread 4076.0x8a4]
warning: QThread(0x3d58d8) tick
warning: Rect # 0 0 100 56
warning: Unmatched true
warning: Updating 0 0
warning: QMutex::lock: Deadlock detected in thread 0xfe8
现在哪个线程0xfe8
是什么?它是主线程吗? 首先,我以为我调用了两次相同的mutex.lock()
。或者func_a()
和func_b()
正在使用相同的互斥锁。那导致了僵局。但没有发现任何这种情况。所以开始调查?
雅我在大多数的地方使用'QMutexLocker'。并仔细看看第一行上的gdb输出'[New thread 4076.0xfe8]'(见上)和'QMutex :: lock:最后一个线程0xfe8中检测到的死锁'。这是否意味着主线程处于死锁状态?希望我能清楚地说明为什么我专注于'0xfe8'的任何线索?根据此输出的 – 2011-04-28 06:37:40
0xfe8是创建的第一个线程。所以是的,它是检测到死锁的gui线程(主线程) – 2011-04-28 07:25:52
警告:QThread(0x3d58d8)tick部分意味着另一个线程已经运行并锁定了主线程也需要的东西。主线程阻塞和死锁在这一点上,这是我从这个输出了解。 – 2011-04-28 07:33:41