これに関するドキュメントを読みましたが、理解していると思います。AutoResetEvent
コードが を通過すると はリセットされますが、 はリセットされませevent.WaitOne()
んManualResetEvent
。
これは正しいです?
これに関するドキュメントを読みましたが、理解していると思います。AutoResetEvent
コードが を通過すると はリセットされますが、 はリセットされませevent.WaitOne()
んManualResetEvent
。
これは正しいです?
はい。料金所とドアの違いのようなものです。これManualResetEvent
は、手動で閉じる (リセットする) 必要があるドアです。はAutoResetEvent
料金所で、1 台の車が通過すると、次の車が通過する前に自動的に閉じます。
andが単一のアトミック操作としてAutoResetEvent
実行されることを想像してみてください。WaitOne()
Reset()
短い答えはイエスです。最も重要な違いは、AutoResetEvent では 1 つの待機中のスレッドしか続行できないことです。一方、ManualResetEvent は、スレッドを停止する (リセットする) ように指示するまで、複数のスレッドを同時に続行できるようにします。
ジョセフ・アルバハリによるC#3.0の簡単な本から引用
ManualResetEventは、AutoResetEventのバリエーションです。これは、WaitOne呼び出しでスレッドが通過した後、自動的にリセットされないという点で異なります。したがって、ゲートのように機能します。Setを呼び出すと、ゲートが開き、ゲートでWaitOneが通過する任意の数のスレッドが許可されます。Resetを呼び出すとゲートが閉じ、ウェイターのキューが次に開くまで蓄積される可能性があります。
ブール値の「gateOpen」フィールド(volatileキーワードで宣言)と「spin-sleeping」を組み合わせてこの機能をシミュレートできます。フラグを繰り返しチェックしてから、短時間スリープします。
ManualResetEventsは、特定の操作が完了したこと、またはスレッドの初期化が完了して作業を実行する準備ができていることを通知するために使用されることがあります。
autoResetEvent.WaitOne()
と類似しています
try
{
manualResetEvent.WaitOne();
}
finally
{
manualResetEvent.Reset();
}
アトミック操作として
はい。これは絶対に正しいです。
状態を示す方法として、ManualResetEvent を見ることができます。何かがオン (セット) またはオフ (リセット) です。ある程度の期間の発生。その状態が発生するのを待っているスレッドは、続行できます。
AutoResetEvent はシグナルに似ています。何かが起こったことを示す一発の兆候。持続時間のない出来事。通常、発生した「何か」は小さく、単一のスレッドで処理する必要がありますが、必ずしもそうとは限りません。したがって、単一のスレッドがイベントを消費した後の自動リセットです。
はい、そうです。
この 2 つの使い方からアイデアを得ることができます。
一部の作業が終了し、これを待っている他の (スレッド) が続行できるようになったことを伝える必要がある場合は、ManualResetEvent を使用する必要があります。
リソースへの相互排他的アクセスが必要な場合は、AutoResetEvent を使用する必要があります。