考虑以下方案:
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将事件设置回非信号。
还有其他选择,例如使用semaphore来控制访问,或者如果您计划只等待很短的时间(旋转锁定性能),但是手动重置事件似乎是要走的路线,则可以使用critical section 。一般来说,请查看synchronization objects。