2011-04-28 61 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修復它。