2011-04-28 220 views
2

我正在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()正在使用相同的互斥锁。那导致了僵局。但没有发现任何这种情况。所以开始调查?

回答

0

要回答哪个线程导致死锁是非常困难的。然而,根据经验,尽量使用QMutexLocker来尽可能避免死锁。这样你的mutext就会自动解锁。

+0

雅我在大多数的地方使用'QMutexLocker'。并仔细看看第一行上的gdb输出'[New thread 4076.0xfe8]'(见上)和'QMutex :: lock:最后一个线程0xfe8中检测到的死锁'。这是否意味着主线程处于死锁状态?希望我能清楚地说明为什么我专注于'0xfe8'的任何线索?根据此输出的 – 2011-04-28 06:37:40

+0

0xfe8是创建的第一个线程。所以是的,它是检测到死锁的gui线程(主线程) – 2011-04-28 07:25:52

+0

警告:QThread(0x3d58d8)tick部分意味着另一个线程已经运行并锁定了主线程也需要的东西。主线程阻塞和死锁在这一点上,这是我从这个输出了解。 – 2011-04-28 07:33:41

0

我曾经看到过这条消息,当我试图从同一个thead锁定一个互斥锁两次。使QMutexrecursive修复它。