0

私はC#/ directxゲームクライアントのJavaへの移植に取り組んでいます。これにより、C#をいくつか学ぶことができ(私は完全に慣れているので)、その間にJavaOpenGLエンジンに関する知識を向上させることができます。

次のようなものに遭遇したとき:

Monitor.Enter(preloadDictionary);
try {
     foreach (PreloadEntry entry in preloadDictionary.Values) {
         if (entry.loaded) continue;
         return entry;
     }
} finally {
     Monitor.Exit(preloadDictionary);
}

次のようなものだと思いますか?

syncronized(preloadDictionary) {
     [...]
}

そして次の場合:

Monitor.Enter(worldServerMap);
try {
     worldServerMap[rv.WorldName] = entry;
     Monitor.PulseAll(worldServerMap);
} finally {
     Monitor.Exit(worldServerMap);
}

リソースを待機しているすべてのスレッドをウェイクアップするための追加PulseAll()のようなものですか?notifyAll()(しかし、コード内で呼び出される場所が見つかりませんでしたMonitor.Wait())。

4

1 に答える 1

2

lock(x) は、最後に Monitor.Enter に続いて Monitor.Exit と同じです。言語のショートカットです。

私に言わせれば、これは C# 言語の弱点の 1 つです。単純に、MINOTIR があったときは良かったのですが、最近ではさまざまなバージョンのモニター (スリム、スピンロックなど) があり、lock はいずれかのバージョンしかサポートしていないためです。彼ら。便利ですが、賢明かどうかはわかりません ;)

リソースで待機しているすべてのスレッドをウェイクアップするための notifyAll() のような追加の PulseAll() はありますか? (しかし、コード内で Monitor.Wait() が呼び出される場所が見つかりませんでした)。

PulseAll は、明示的な待機がない限り、ほとんど意味がありません。おそらく、入力したくない他のスレッドからのものです。Enter はロックが取れない場合は待機するので、通常の同期を行うには Exit で十分です。

Wait などを探し始めます - MOnitor の PulseAll は、この段階で入力しようとせずに待機しているスレッドがある場合にのみ意味があります。基本的に待機させてからパルスを取得して入力しようとする悪い設計の問題につながる可能性があります。これは、いくつかの dsort の非ブロック設計の一部である可能性があります - 言うのは難しいですが、それは珍しいことです。コードのどこかに Wait が見つからない場合は、PulseAll を強制終了して、何が起こるかを確認します。

于 2012-06-03T18:02:06.023 に答える