2009-03-07 161 views
6

此: 可以將單個SetEvent的()觸發多個WaitForSingleObject的()

http://msdn.microsoft.com/en-us/library/ms686915(VS.85).aspx

似乎表明沒有。

我有三個進程通過管道進行通信。進程A創建一個事件,進程B各自使用WaitForSingleObject(在第二個線程中)。

所以現在我們有兩個等待-SINGLE事件的進程。

進程A用SetEvent()觸發事件,進程B響應,進程C沒有響應。

結論:

每個WaitForSingleObject的()需要一個獨特的事件...正確?

回答

5

使用手動重置事件觸發單個事件的多個線程。

Here 是使用「手動重置事件」標誌

+0

不幸的是我不能控制進程A,所以我不能實現這一點。 – 2009-03-08 10:11:51

2

您可以使用手動復位Evenets和PulseEvent函數釋放所有正在等待該事件的線程的一個例子。

但請注意,這種方法本質上是活潑的,因爲無法分辨哪些是「當前正在等待的線程......」。如果需要精確匹配喚醒/ 2等待事件,則應該使用更可靠的同步機制。

+0

我沒有提到這一點,但我沒有任何控制過程A,但我會看看PulseEvent函數供將來參考..謝謝。 – 2009-03-07 12:29:10

0

我希望這個例子可以幫助你:

                        
                          handle1A = CreateEvent(LPSECURITY_ATTRIBUTES, ManualReset, InitialState, NAME) 

handle1B = CreateEvent(LPSECURITY_ATTRIBUTES, ManualReset, InitialState, NAME) 

handle2A = CreateEvent(LPSECURITY_ATTRIBUTES, ManualReset, InitialState, NAME+GetCurrentThreadId()) 

handle2B = CreateEvent(LPSECURITY_ATTRIBUTES, ManualReset, InitialState, NAME+GetCurrentThreadId()) 

                        
                      

A)如果您創建一個具有相同 NAME 一個事件,每一個 setEvent 信令中的所有 waitforsingleobjects

                        
                          SetEvent(handle1A) // Send signaling to handle1A and handle1B 

                        
                      

B)如果您創建一個事件只有一個唯一 NAME , setEvent 只發送信號到參考句柄

                        
                          SetEvent(handle2) // Send signling only to handle2A. The Id Thread is unique 

                        
                      
0

如果事件是手動重置事件,則一個事件可以通知多個線程。自動重置事件不能做到這一點。如果多個花等待同時等待自動復位事件,並且您將其設置爲有信號狀態,則只有一個線程存在並重置它,並且其他線程的行爲將不確定。雖然從Microsoft文檔中,我們可能會認爲只有一個線程會退出,而其他線程肯定不會退出。無論如何,我們必須考慮以下報價:「不要假設先入先出(FIFO)訂單。外部事件,如內核模式APC可以更改等待順序「源 - https://msdn.microsoft.com/en-us/library/windows/desktop/ms682655(v=vs.85).aspx

CreateEvent函數具有bManualReset參數。如果它爲TRUE,則該函數創建一個手動重置事件對象,該對象需要使用ResetEvent函數將事件狀態設置爲無信號。如果此參數爲FALSE,則該函數會創建一個自動重置事件對象,並且系統會在釋放單個等待線程(即已從WaitForMultipleObjects或WaitForSigleObject等函數退出)後自動將事件狀態重置爲無信號 - 但是,我之前寫過,只有一個線程不會被通知全部。

由於對PulseEvent - 這是不可靠的,不應該被使用 - 見 https://msdn.microsoft.com/en-us/library/windows/desktop/ms684914(v=vs.85).aspx

只有那些線程由PulseEvent是在「等待」狀態,此刻PulseEvent通知被調用。如果他們處於任何其他狀態,他們將不會被通知,並且您可能永遠不知道線程狀態是什麼。等待同步對象的線程可以通過內核模式異步過程調用暫時從等待狀態中移除,然後在APC完成後返回到等待狀態。如果在線程從等待狀態中移除期間發生對PulseEvent的調用,則線程將不會被釋放,因爲PulseEvent只釋放正在調用的那些線程。你可以找到更多關於在下面的鏈接內核模式異步過程調用(APC):

您可以獲取有關自動更多的想法重置事件和手動重置事件從以下文章:

相關問題