是每次调用 SetEvent 进行自动复位事件都会唤醒一个线程



有三个线程和自动重置事件。当第二个和第三个线程正在等待此事件时,第一个线程调用 SetEvent 两次。系统是否保证两个等待线程都将唤醒?

我已经在MSDN中阅读了.NET Framework AutoResetEvent Class的注释:不能保证每次调用 Set 方法都会释放一个线程。如果两个调用靠得太近,以至于第二个调用发生在线程释放之前,则只释放一个线程。就好像第二个电话没有发生一样。

Win32 API 是否正确?

请考虑以下方案:

Event Signaled | Thread 1   | Thread 2      | Thread 3
---------------------------------------------------------
false          | SetEvent() |               |            
true           |            |               |            
true           |            | Wait Complete |            
false          |            |               |            
false          | SetEvent() |               |            
true           |            |               |            
true           |            |               | Wait Complete
false          |            |               |            

成功

Event Signaled | Thread 1   | Thread 2      | Thread 3
---------------------------------------------------------
false          | SetEvent() |               |            
true           |            |               |  
true           | SetEvent() |               |            
true           |            |               |            
true           |            | Wait Complete |            
false          |            |               |            
false          |            |               | Wait does not complete
false          |            |               |    

失败

根据在特定时间执行的线程,您可能会也可能不会在其他线程上完成等待。

应将事件更改为手动重置事件,以确保所有线程都将完成其等待,并在需要时使用 ResetEvent 将事件设置回无信号。

还有其他选项,例如使用信号量来控制访问,或者如果您计划只等待很短的时间(旋转锁定性能),则使用关键部分,但手动重置事件似乎是要走的路。通常,签出同步对象。

最新更新