次のシナリオを検討してください。
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
必要に応じてイベントを非シグナルに戻すために使用する必要があります。
セマフォを使用してアクセスを制御したり、短時間だけ待機する予定の場合はクリティカルセクション(スピンロックのパフォーマンス)など、他のオプションもありますが、手動リセットイベントが適切な方法のようです。一般に、同期オブジェクトをチェックアウトします。