當使用全域命名的互斥鎖在兩個行程之間進行同步時,兩個行程中的一個被終止(比如在任務管理器中,或者由于故障),另一個行程從WaitForSingleObject()
相應的錯誤代碼回傳并可以繼續。
使用全域名稱信號量時,如果其他行程被殺死/終止,它不會釋放等待行程。 WaitForSingleObject()
將等到它超時(可能是INFINITE
或幾個小時)。
當另一個行程被殺死或終止時,如何停止WaitForSingleObject()
等待?
在這種情況下,用于控制共享緩沖區的讀/寫請求的信號量有一個計數。請求者向提供者發出信號以提供某些資料,提供者更新緩沖區并向請求者發回信號,表明它現在可以讀取緩沖區。
uj5u.com熱心網友回復:
我建議您切換到使用 WaitForMultipleObjects 并等待可能終止的行程的句柄(或執行緒,如果您想在單個行程中執行此操作),除了您的信號量句柄。這樣您就可以繼續使用 INFINITE 超時。只需檢查回傳值以查看發出信號的物件。
此外,我會考慮一個行程終止,同時持有一個信號量有點錯誤,特別是用于實際行程間通信的信號量。
uj5u.com熱心網友回復:
添加到接受的答案。
waitms
如果要長于某個值,我添加了邏輯,maxwaitms
然后請求者/提供者GetCurrentProcessId()
在長行程之前交換提供者行程 ID ()。請求者打開OpenHandle()
提供者行程的句柄 ( ) 并等待信號量和行程句柄以知道何時完成寫入(或行程終止)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/489306.html
上一篇:Visualbasic.net中的范圍問題無法在finally子句中關閉流物件,獲取System.NullReferenceException
下一篇:在C中實作執行緒