ConditionJava では、複数のオブジェクトを 1 つの に関連付けることができますReentrantLock。C#に相当するものは何ですか?
実際の例: JavaConditionドキュメントの実装例では、同じロックに結び付けられたとの 2 つのConditionオブジェクトを使用しています。その例をどのように C# に変換できますか?notFullnotEmpty
背景Condition: 2 つのオブジェクトを使用して、同じオブジェクトに関連付けられたさまざまな状態を通知するJava コードをよく見かけますLock。C#では、次のいずれかができるようです
Monitor.Enterオブジェクトを呼び出してからMonitor.WaitOne/を呼び出しますMonitor.Pulseが、これは 1 つの条件にすぎません。- 複数の
Auto/ManualResetEventオブジェクトを使用しますが、これらは待機後に特定のロックをアトミックに再取得できません。
注: 1 つの方法を考えることができます:単一のオブジェクトでMonitor.WaitOne/を使用し、ウェイクアップ後に状態をチェックします。Monitor.PulseAllこれは、偽のウェイクアップから保護するために、Java でも行うことです。ただし、別の条件で待機しているスレッドを起動する可能性があるため、PulseAllの代わりに呼び出す必要があるため、実際にはそうではありません。残念ながら、代わりに使用すると、パフォーマンスに影響があります (スレッドが同じロックを求めて競合します)。PulsePulsePulseAllPulse