2011-08-02 81 views
2

我有一個情況,線程1正在等待條件變量A,它應該被線程2喚醒。現在線程2正在等待條件變量B,它應該被線程喚醒1.在我使用條件變量的場景中,我無法避免這種死鎖情況。我檢測到循環(死鎖)並終止其中一個參與死鎖的線程。打破條件變量死鎖

現在,我不知道是如何簡單地終止線程說線程1,它是在一個條件變量的等待。

將是一些指針感謝。 謝謝

+0

你爲什麼就不能避免僵局? – bdonlan

回答

3

條件變量不像互斥體。我的意思是說它們不僅可以被一個控制它們的線程所使用。保護條件變量互斥通過螺紋等待這樣一個踢處理這樣但是這僅鎖定在短時間內,手動解鎖通過螺紋踢(信令)的條件變量之後,並自動。你可以完全分開線程(就像你的死鎖檢測器,讓我們稱它爲線程3)只需踢一個條件變量,它就會喚醒等待它的線程。

條件變量的通常用例是線程等待踢,然後檢查以確保您有工作(不要因爲變量被踢了,就認爲有工作)。這是爲了照顧虛假的喚醒。

一種可能性是當線程3檢測到死鎖時設置一個「全局」deadlock_occurred標誌,然後也有線程3踢所有條件變量。

線程1和線程2在喚醒後應該​​做的第一件事是檢查該標誌並採取適當的操作(可能退出線程)。

如果您構建應用程序以使線程對自己的生命週期負責,那麼您會發現進入很少的死鎖類型的麻煩。當線程不處於可被終止的狀態時,從外部殺死線程太容易了。不要誤會我的意思,還有其他的方法來處理它(如使用取消點),但我嘗試和測試的解決方案是迄今爲止我所發現的最簡單的。