如標題所示。我需要的功能涉及在某些條件下殺死正在運行的執行緒。不幸的是,如果所述執行緒鎖定了某個全域互斥鎖,則該互斥鎖將永遠保持鎖定狀態,因為我使用的設計是一個執行緒嘗試獲取互斥鎖,但它僅在從另一個執行緒完成一些作業后才被釋放,這允許另一個執行緒呼叫第一個執行緒重新獲取它。由于第一個執行緒被殺死,互斥鎖永遠不會解鎖,第二個執行緒被卡住并且無法做任何事情。
我會在執行緒被殺死(即,從同一執行緒的新實體)后解鎖互斥鎖,但顯然這是不允許的,并導致未定義的行為,因為互斥鎖必須從同一個執行緒解鎖已鎖定它。我該怎么辦?謝謝。
uj5u.com熱心網友回復:
我需要的功能涉及在某些條件下殺死正在運行的執行緒。
執行緒是一個實作細節。除非有很多您無法控制的代碼,否則不可能為了功能而終止執行緒。如果您是這種情況,解決方法是將您無法控制的執行緒隔離到它自己的行程中。您可以安全地終止行程。
否則,您無法安全地終止執行緒。但你沒有必要。你需要做的是阻止執行緒做你不希望它做的作業,讓它做你想讓它做的作業。
您尚未描述執行緒正在執行的作業或您正在使用的執行緒標準,因此很難為您提供最佳方法的建議。但一般有兩種方法:
有一些共享狀態來跟蹤需要完成的作業。讓可能需要停止作業的代碼定期檢查是否應該停止作業。
使用某種信號方法來通知正在執行可能需要中斷的作業的執行緒,它正在執行的作業可能不再需要完成。這避免了定期檢查的需要,但通常不會避免共享狀態的需要。
作為最后的手段,只需實作您自己的互斥鎖,該互斥鎖支持執行緒死亡后解鎖。這樣,執行緒將只持有支持該功能的互斥鎖實體。在您的實作中,將有一個由內部互斥鎖保護的內部布林值,表明該互斥鎖已被保留。這樣,當執行緒死亡時,您只需獲取內部互斥鎖,清除內部布林值,然后釋放內部互斥鎖。
這是您的邏輯的外觀:
要鎖定互斥鎖:
- 獲取內部互斥鎖。
- 當內部布林值為真時,等待內部條件變數。
- 將內部布林值設定為 true。
- 釋放內部互斥鎖。
要解鎖互斥鎖:
- 獲取內部互斥鎖。
- 將內部布林值設定為 false。
- 廣播內部條件變數。
- 釋放內部互斥鎖。
現在,執行緒死亡后,您可以呼叫上面的“解鎖互斥鎖”操作。(當然,首先要確保互斥鎖保護的任何狀態都是一致的。)
uj5u.com熱心網友回復:
正如@meaning-matters 所建議的,這應該是可能的,至少在 Linux 上,通過攔截實時信號 32 并使用 pthread_cancel,這是使用信號實作的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/337951.html
上一篇:如何匹配R中函式引數的多種組合?
下一篇:為await函式創建另一個執行緒
