2009-07-01 79 views
4

我正在瀏覽一個遺留代碼,發現代碼使用SuspendThread函數暫停工作線程的執行。每當工作線程需要處理請求時,調用線程就會恢復該工作線程。任務完成後,線程將自行暫停。有沒有任何好處,暫停線程,讓它等待?

我不知道爲什麼這樣做。根據我的說法,使用帶有WaitForSingleObject API的Event對象可以更優雅地完成它。

我的問題是,與使線程等待同步對象相比,掛起線程有什麼好處(如果有的話)?在哪種情況下你會更喜歡SuspendThread,ResumeThread API?

+0

+1,我正要發佈這個問題。我很高興我先搜索,而不必等待人們回答。 – 2010-04-21 13:41:58

回答

11

掛起線程在每一個我曾經在工作環境中氣餒,主要關注的是,一個線程可以同時持有到一個鎖定一些資源,可能造成死鎖暫停。根據同步對象保存的任何資源都不值得承擔死鎖風險。

當線程被迫等待時,這不是一個問題,因爲線程固有地控制了它自己的「暫停」,並且可以確保釋放它所持有的任何鎖。

如果您閱讀關於SuspendThread的文檔,您會發現它是供調試器使用的。如果可以的話,將它從任何應用程序代碼中撕下來。


爲了說明我的觀點,對 「不使用」 暫停方法列表我遇到:

作爲旁白;我真的很驚訝.NET中的Thread.Suspend在1.0/1.1版本中被「支持」,它從一開始就應該是值得警告的。

+0

其次,你可以從「暫停」中獲得任何好處,唯一的缺點是可以忽略任何好處,因爲它通常是不安全的,只是一個壞主意......加上......一個內核每線程對象不會殺死你。 – jerryjvl 2009-07-01 05:22:21

2

如果您想喚醒某個特定線程,則需要爲每個線程分別設置一個事件對象。這會導致更高的內核對象消耗,這本身並不好,並且可能會導致早期版本的Windows出現問題。通過手動恢復,您不需要任何新的內核對象。