2

たとえば、ミューテックスを介して同じ相互に排他的な部分にアクセスする 3 つのスレッドがあるとします。

この例を挙げましょう。

最初のスレッドはミューテックスをプローブし、最初にその所有権を取得します。

//THREAD 1
//TIME: 2013-03-13 01:00:00.000Z
WaitForSingleObject(hMutex, INFINITE);

//Performs the operation that lasts 50 ms

ReleaseMutex(hMutex);

それから 10 ミリ秒後に、スレッド 2 もそれを要求します。

//THREAD 2
//TIME: 2013-03-13 01:00:00.010Z
WaitForSingleObject(hMutex, INFINITE);
//Do work
ReleaseMutex(hMutex);

そして 20 ミリ秒後にスレッド 3 もそれを要求します。

//THREAD 3
//TIME: 2013-03-13 01:00:00.030Z
WaitForSingleObject(hMutex, INFINITE);
//Do work
ReleaseMutex(hMutex);

この状況では、スレッド 2 が常にスレッド 3 の前にミューテックスの所有権を取得することを確認できますか (いわば「最初に」あったため)、またはスレッド 2 と 3 の間で誰が所有権を取得するかは完全に恣意的ですか?

また、ミューテックスで任意の場合、最初に待機しているスレッドが最初に所有権を取得するようにするにはどうすればよいですか?

4

2 に答える 2

5

オペレーティング システムが Mutex を待機しているスレッドの 1 つを起動し、それをスレッドに付与するという意味で、目的のために任意であると言っても過言ではありませんが、どのスレッドに関する決定は非決定論的です。

グローバル優先度インデックスを使用して、スレッド間の優先度に独自のスキームを実装できます。次に、Mutex を待機しているスレッドの 1 つが最初の行ではないときにそれを受信すると、すぐにそれを放棄し、Mutex が再び使用可能になるまで待機します。これは、Mutex が取得され、グローバル インデックスと比較したスレッドの優先度インデックスに従ってスレッドが先頭になるまで繰り返される必要があります。

于 2013-03-13T19:59:30.510 に答える
2

Vista および Windows Server 2003 SP1 より前は、ロック プリミティブは公平性 (FIFO) を提供しようとしていました。公平性がロック コンボイにつながるため、Vista および Windows Server 2003 SP1 以降、ロック プリミティブは明らかに不公平です (FIFO なし)。Windows Server 2003 SP1 および Windows Vista のアンチコンボイ ロックと、リンクされている記事を参照してください。

于 2013-03-13T23:12:36.433 に答える