0

スレッドがロックを取得しようとして取得された場合、スレッドはスリープ状態になり、ロックが解放されるまでスリープ状態を維持する必要があります。スレッドがロックを解放した場合 (そして、それを作成したスレッドによってロックが取得された場合)、そのスレッドはスレッドを起動する必要があります。

私の質問は、ロックアドレスですべてのスレッドをウェイクアップする場合と、ロックアドレスで単一のスレッドをウェイクアップする場合(ロック解除後)に違いはありますか?また、1 つのスレッドをウェイクアップする場合、どのスレッドをウェイクアップするのが理にかなっており、最初にロック アドレスでスリープ状態になるのでしょうか?

1 つのスレッドをウェイクアップすることには、いくつかの利点があります。すべてをウェイクアップすると、n-1 がスリープ状態に戻る可能性があるからです。しかし、単一のスレッドを起こすことにデメリットがあるかどうかはわかりません。

4

1 に答える 1

2

Windows ロック (ミューテックス、クリティカル セクション) と .Net モニター (C# では、ブロックの入力/終了の構文シュガーとしてキーワード lock を使用できます) を混同していると思います。

Windows のミューテックスとクリティカル セクションは、開始および終了することしかできません。つまり、それらに関連付けられているキューは 1 つだけです。キュー内のすべてのスレッドはロックが解放されるのを待ち、解放されると、キュー内の次のスレッドがロックを制御して実行を開始します。これはすべて自動的に行われます。現在ロックを保持しているスレッドは、これに関与していません。ロックが解放されるのを待っている 1 つ以上の他のスレッドをウェイクアップすることはできません。

.Net の Monitor には、準備完了キューと待機キューの 2 つのキューがあります。

レディ キューは、Win32 Mutex またはクリティカル セクション キューとまったく同じように動作し、Enter/Leave メソッドを使用して制御されます。

待機キューは、Wait/Pulse/PulseAll メソッドを使用して制御される個別のキューです。これらのメソッドは、モニターを保持しているスレッドによってのみ呼び出すことができます。スレッドが Wait を呼び出すと、Monitor が解放され、待機キューに入ります。次に、別のスレッドが Pulse を呼び出して 1 つのスレッドを移動するか、Pulse All を呼び出してすべてのスレッドを待機中から準備完了キューに移動できます (Pulse/PulseAll を呼び出すスレッドが Monitor を保持していることを思い出してください)。

コンピューター サイエンスの観点からは、モニターは同期スレッドに必要な単一のプリミティブです (セマフォ、イベント、ミューテックス、バリアなどはすべてモニターで実装できます)。実用的な観点からは、モニターはミューテックスとして、また次のような状況で役立ちます。アクションは、ロックステップで 2 つのスレッドによって実行される必要があります。ただし、ほとんどの場合、イベントを使用するとコードが読みやすくなります。

参考文献:

ウィキペディアの歴史的 / コンピューター サイエンスの側面のモニターに関するページ

MSDN モニター クラス

于 2013-01-23T05:09:33.677 に答える