可以单个SetEvent()触发多个WaitForSingleObject()

时间:2009-03-07 11:18:22

标签: c++ winapi events

此:

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

似乎不建议。

我有三个进程通过管道进行通信。流程A创建一个事件,流程B& C每个都使用WaitForSingleObject(在第二个线程中)。

所以现在我们有-TWO-处理每个等待-SINGLE-事件。

进程A使用SetEvent()触发事件,进程B响应,进程C没有响应。

结论:

每个WaitForSingleObject()都需要一个唯一的事件......正确吗?

4 个答案:

答案 0 :(得分:6)

使用手动重置事件触发单个事件的多个线程。

Here是一个使用“手动重置事件”标志

的示例

答案 1 :(得分:3)

您可以使用手动重置Evenets和PulseEvent函数来释放当前等待事件的所有线程。

但是请注意,这种方法本质上是活泼的,因为没有办法分辨哪些是“当前正在等待的线程......”。如果需要完全匹配wakeup / 2等待事件,则应使用更可靠的同步机制。

答案 2 :(得分:1)

我希望这个例子可以帮到你:

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

答案 3 :(得分:0)

如果是一个手动重置事件,则一个事件可以通知多个线程。自动重置事件无法执行此操作。如果多个胎面同时等待自动重置事件,并且您将其设置为信号状态,则只存在一个线程并将其重置,并且其他线程的行为将是未定义的。虽然,从Microsoft文档中,我们可以假设只有一个线程将退出而其他线程肯定不会退出。无论如何,我们必须考虑以下引用:“不要假设先进先出(FIFO)订单。内核模式APC等外部事件可以更改等待顺序“Source - https://msdn.microsoft.com/en-us/library/windows/desktop/ms682655(v=vs.85).aspx

CreateEvent函数具有bManualReset参数。如果为TRUE,则该函数创建一个手动重置事件对象,该对象需要使用ResetEvent函数将事件状态设置为无信号。如果此参数为FALSE,则该函数会创建一个自动重置事件对象,并且系统会在释放单个等待线程后自动将事件状态重置为非信号状态,即已从WaitForMultipleObjects或WaitForSigleObject等函数退出 - 但是,as as我之前写过,只有一个帖子不会被通知。

关于PulseEvent - 它是不可靠的,不应该使用 - 请参阅https://msdn.microsoft.com/en-us/library/windows/desktop/ms684914(v=vs.85).aspx

只有那些在#34;等待"中的PulseEvent通知这些线程。现在调用PulseEvent的状态。如果它们处于任何其他状态,则不会通知它们,并且您可能永远不会确定线程状态是什么。等待同步对象的线程可以通过内核模式异步过程调用暂时从等待状态中删除,然后在APC完成后返回到等待状态。如果在线程从等待状态中删除期间发生对PulseEvent的调用,则不会释放该线程,因为PulseEvent仅释放那些在被调用时正在等待的线程。您可以在以下链接中找到有关内核模式异步过程调用(APC)的更多信息:

您可以从以下文章中获得有关自动重置事件和手动重置事件的更多信息: