0

Java では、すべてのオブジェクトを待機できるため、この種のシナリオをプログラムすることが可能です。

スレッド A はオブジェクト a を待機します

スレッド B はオブジェクト b を待機します

スレッド C は

スレッド A は b で通知します

C# のモニターを使用すると、スレッド C は b (または b と a) しか起動できないように思えますが、そのようなシナリオを可能にするにはどうすればよいですか?

4

4 に答える 4

3

C# の Monitor を使用すると、Thread C は b しか起きないように思えます

なんで?スレッド C が呼び出しMonitor.Pulse(a)ていると、Java と同じように、スレッド A が起動a.pulse()します。

微妙な違いはありますが、.NET のMonitor.Wait//は Java のPulse//とPulseAll非常によく似ています。あなたが現在考えている違いはどれも当てはまらないと強く思いますが、具体的なコードがなければそれを言うのは難しいです.Object.waitnotifynotifyAll

于 2012-07-04T18:21:50.653 に答える
1

Monitor.WaitおよびMonitor.Pulseメソッドを探しています。

于 2012-07-04T18:21:13.847 に答える
1

C# 同期関数はクラスのメンバーであるため、クラスのメンバーであり、すべてのオブジェクトで使用できるJava とは対照的に、それらを使用するにMonitorは特別なインスタンスが必要であると考えているようです。Monitorjava.lang.Object

まったく逆です。Monitorインスタンスはまったくありません。C# では、関数は静的メソッドであり、引き続き任意のオブジェクトで機能します。クラスの唯一の理由は、余分なメンバー (Intellisense の提案リストなどに表示される) で混乱するのMonitorを防ぐことです。System.Object

Pulseただし、使用するコードには通常、競合状態が隠されていることがわかりました。信頼性の高いコードを簡単に記述できるようにする、スレッド間で同期するためのより良い方法があります。

于 2012-07-04T18:25:34.267 に答える
0

正しく理解できたかどうかわかりませんが、問題はありません。次のコードは意図的に簡略化されており、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# でどのように機能するかについては、こちらを参照してください。

于 2012-07-04T18:34:28.883 に答える