Java では、すべてのオブジェクトを待機できるため、この種のシナリオをプログラムすることが可能です。
スレッド A はオブジェクト a を待機します
スレッド B はオブジェクト b を待機します
スレッド C は
スレッド A は b で通知します
C# のモニターを使用すると、スレッド C は b (または b と a) しか起動できないように思えますが、そのようなシナリオを可能にするにはどうすればよいですか?
Java では、すべてのオブジェクトを待機できるため、この種のシナリオをプログラムすることが可能です。
スレッド A はオブジェクト a を待機します
スレッド B はオブジェクト b を待機します
スレッド C は
スレッド A は b で通知します
C# のモニターを使用すると、スレッド C は b (または b と a) しか起動できないように思えますが、そのようなシナリオを可能にするにはどうすればよいですか?
C# の Monitor を使用すると、Thread C は b しか起きないように思えます
なんで?スレッド C が呼び出しMonitor.Pulse(a)
ていると、Java と同じように、スレッド A が起動a.pulse()
します。
微妙な違いはありますが、.NET のMonitor.Wait
//は Java のPulse
//とPulseAll
非常によく似ています。あなたが現在考えている違いはどれも当てはまらないと強く思いますが、具体的なコードがなければそれを言うのは難しいです.Object.wait
notify
notifyAll
Monitor.Wait
およびMonitor.Pulse
メソッドを探しています。
C# 同期関数はクラスのメンバーであるため、クラスのメンバーであり、すべてのオブジェクトで使用できるJava とは対照的に、それらを使用するにMonitor
は特別なインスタンスが必要であると考えているようです。Monitor
java.lang.Object
まったく逆です。Monitor
インスタンスはまったくありません。C# では、関数は静的メソッドであり、引き続き任意のオブジェクトで機能します。クラスの唯一の理由は、余分なメンバー (Intellisense の提案リストなどに表示される) で混乱するのMonitor
を防ぐことです。System.Object
Pulse
ただし、使用するコードには通常、競合状態が隠されていることがわかりました。信頼性の高いコードを簡単に記述できるようにする、スレッド間で同期するためのより良い方法があります。
正しく理解できたかどうかわかりませんが、問題はありません。次のコードは意図的に簡略化されており、a と b のクラスと宣言はありません。
public void ThreadARunner()
{
lock(a)
Monitor.Wait(a); //waits here until thread C pulses, releasing the lock on a
lock(b)
Monitor.Pulse(b); //wakes up thread B
}
public void ThreadBRunner()
{
lock(b)
Monitor.Wait(b); //waits here until thread A pulses, releasing the lock on b
}
public void ThreadCRunner()
{
lock(a)
Monitor.Pulse(a); //wakes up thread a
}
さらにヘルプが必要な場合は、詳細を提供してください。Monitor が C# でどのように機能するかについては、こちらを参照してください。