有三个线程和自动重置事件。当第二个和第三个线程正在等待此事件时,第一个线程调用 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
将事件设置回无信号。
还有其他选项,例如使用信号量来控制访问,或者如果您计划只等待很短的时间(旋转锁定性能),则使用关键部分,但手动重置事件似乎是要走的路。通常,签出同步对象。