換句話說,我有一個線程可以多次啓動並調用waitHandle.Set()
。然後我開始幾個線程,每個線程都在等待WaitHandle
。它們的X會被標記,其中X是原始線程調用的次數waitHandle.Set()
?如果您調用EventWaitHandle.Set()X次,如果X線程尚未啓動,它是否會發出X線程信號?
有沒有一種結構支持我想要更緊密地完成的工作?
換句話說,我有一個線程可以多次啓動並調用waitHandle.Set()
。然後我開始幾個線程,每個線程都在等待WaitHandle
。它們的X會被標記,其中X是原始線程調用的次數waitHandle.Set()
?如果您調用EventWaitHandle.Set()X次,如果X線程尚未啓動,它是否會發出X線程信號?
有沒有一種結構支持我想要更緊密地完成的工作?
也許,但可能不是。
事件只能設置或不設置,如果沒有任何事件可以取消設置,那麼Set的重複調用不會改變它的狀態,除非它是一個自動重置事件,並且至少有一個線程正在等待它。通過手動重置事件,等待(或開始等待)的任何線程將被釋放,直到事件被解除。
我想你會真的想要一個信號,它確實有一個計數和支持設置ň次發佈ñ線程(即使其中一些線程纔開始等待後,一些通話設置)。
這取決於EventResetMode
。如果它設置爲EventResetMode.AutoReset
它只會釋放一個線程。如果它是'EventResetMode.ManualReset',但是它會釋放在事件上被阻塞的所有線程。
Semaphore.Release(Int)
其中int是計數會做到這一點一個方式。
有沒有辦法讓它釋放X線程,其中X是調用waitHandle.Set()'的次數? – 2009-05-05 20:11:55
是的。將其創建爲Auto。你想做什麼?如果你能提供更多信息,我相信有更好的方法。正如下面提到的,你也可以使用信號量,但有些東西聞起來很腥。 – 2009-05-05 20:15:37
不,自動重置事件在這裏不合適。你依賴於調用Set的線程只調用一次。如果事件在任何線程等待滿足之前被設置了兩次,那麼只有一個等待線程運行。 – 2009-05-05 20:33:45
正如Richard所述,EventWaitHandles只有一個標誌並且不能計算Set被調用的次數。添加計數變量的簡單解決方案會導致競爭條件。
William Kempf有一個article爲什麼計數變量不起作用,以及使用.Net Monitor類的解決方案。
是的,我想要一個信號燈。我記得它的機制,但不是名字。自從我爲資源池編寫低級線程代碼已經有一段時間了。 – 2009-05-05 20:23:25