5

複数のスレッドから単一のオブジェクトへのアクセスを制御するミューテックスがあります。スレッドが終了すると、ミューテックスのロックが解除され、オーダー スレッドがオブジェクトを操作できるようになります。WaitForSingleObject 関数を使用する Windows では、スレッドが通知される順序はありますか? ミューテックスをロックしようとする最初のスレッドが、ミューテックスのロックを許可されるようにします。ブロックされたスレッドへのシグナルがランダムにならないように、これは FIFO キューになります。これを実現するには、独自のキューイング メカニズムを実装する必要がありますか? もしそうなら、どの機能が便利ですか?

4

4 に答える 4

8

FIFO シグナリングは、コンボイのロックにつながります。Win32 API の新しいバージョンでは、コンボイの問題は、ミューテックスやその他の同期プリミティブを明示的に不公平(つまり、FIFO なし) にすることで解決されます。

複数のスレッドがミューテックスで待機している場合、待機中のスレッドが選択されます。先入れ先出し (FIFO) の順序を想定しないでください。カーネル モード APC などの外部イベントによって、待機順序が変更される場合があります。

于 2009-10-09T17:42:40.003 に答える
0

ロック解除をFIFO順に実行する場合は、カスタムロックを使用できます。FIFOロックはACEに存在します。これはACE_Tokenと呼ばれ、オープンソースであるため、リファレンス実装として使用できる可能性があります。それを使用するオーバーヘッドは最小限になると思います。

于 2009-10-11T10:39:19.953 に答える
0

はい、FIFO キューが必要な場合は、独自のキューイング メカニズムを実装する必要があります。

于 2009-10-09T18:44:42.727 に答える
0

独自のスケジューリングを行う Windows の方法は、ファイバーを使用することです。メイン スレッドはミューテックスで待機し、復帰したら、スレッド セーフ キュー (FIFO) から明示的に SwitchToFiber を呼び出します。

  1. SwitchToFiber を呼び出すスレッドは、ConvertThreadToFiber を呼び出す必要があります。
  2. SwitchToFiber の関数は、QUEUE から SwitchToFiber を呼び出す必要があります。
于 2009-10-14T11:13:10.900 に答える