0

3 つのスレッドと自動リセット イベントがあります。2 番目と 3 番目のスレッドがこのイベントを待機している間、最初のスレッドは SetEvent を 2 回呼び出します。システムは、待機中の両方のスレッドがウェイクアップすることを保証していますか?

MSDN で .NET Framework AutoResetEvent Class に関するこのメモを読みました: Set メソッドへのすべての呼び出しがスレッドを解放するという保証はありません。2 つの呼び出しが近すぎて、スレッドが解放される前に 2 番目の呼び出しが発生した場合、1 つのスレッドのみが解放されます。2 回目の呼び出しが発生しなかったかのようです。

Win32 API に適していますか?

4

1 に答える 1

3

次のシナリオを検討してください。

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必要に応じてイベントを非シグナルに戻すために使用する必要があります。

セマフォを使用してアクセスを制御したり、短時間だけ待機する予定の場合はクリティカルセクション(スピンロックのパフォーマンス)など、他のオプションもありますが、手動リセットイベントが適切な方法のようです。一般に、同期オブジェクトをチェックアウトします。

于 2012-12-04T13:02:06.653 に答える