c-ミューテックス所有権キューの順序

たとえば、相互排他的な同じ部分にミューテックスを介してアクセスする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の前に常にmutexの所有権を取得することを確認できます(いわば「最初の行」であるため)、またはスレッド2と3の間で所有権を取得するのは完全に任意ですか?

そして、ミューテックスで任意である場合、最初の待機スレッドが最初に所有権を取得することを確認する方法は?

ベストアンサー
オペレーティングシステムがMutexを待機しているスレッドの1つをウェイクアップしてスレッドに付与するという意味で、あなたの目的のために任意であると言うのはかなり安全ですが、どのスレッドに関する決定は非決定的です。

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

転載記事の出典を記入してください: c-ミューテックス所有権キューの順序 - コードログ