私が理解している限り、WindowsではCRITICAL_SECTIONは非再帰的ミューテックスとしてのみ使用できます。再帰的ミューテックスを取得するには、OpenMutexとその仲間を使用する必要があります。
ただし、AFAIU、Win32 Mutexは条件変数(InitializeConditionVariable et al。)では使用できません。
Windowsで条件変数と組み合わせて再帰ミューテックスを使用する方法はありますか?
私が理解している限り、WindowsではCRITICAL_SECTIONは非再帰的ミューテックスとしてのみ使用できます。再帰的ミューテックスを取得するには、OpenMutexとその仲間を使用する必要があります。
ただし、AFAIU、Win32 Mutexは条件変数(InitializeConditionVariable et al。)では使用できません。
Windowsで条件変数と組み合わせて再帰ミューテックスを使用する方法はありますか?
valdo のコメントは正しいです。CRITICAL_SECTIONは再帰的です。MSDN からの引用は次のとおりです。問題が解決しました。
それはまったく意味がありません。意味的には、条件変数のポイントは、待機中にロックをアトミックに解放することです。これにより、他のスレッドがロックを取得して、待機していることを実行できるようになります。ただし、再帰的ミューテックスの「解放」操作では、実際にはロックが解除されない可能性があるため、解放後に待機するとデッドロックが発生する可能性があります。これを行う方法が必要であるという事実は、設計または条件変数の理解に何か問題があることを強く示唆しています。
考えてみてください。再帰ミューテックスのロックを保持する関数が、2 番目のロックを取得する関数を呼び出してからスリープ関数を呼び出すとどうなるでしょうか? ロックが解除されると、ロックを保持している間にオブジェクトが変更されるため、最初の関数のロジックが壊れます。ロックが解放されない場合、別のスレッドがそれを実現するために必要なロックを保持しているため、待っていることが決して起こらないため、待機はデッドロックになります。
すでにロックされているかどうかを知らずに条件変数を使用する賢明な方法はありません。また、ロックしているかどうかがわかっている場合は、再帰的なロック機能は必要ありません。すでにロックされていることがわかっている場合は、わざわざロック関数を呼び出さないでください。まだロックを持っていないことがわかっている場合、再帰的でなくてもロック機能は正常に機能します。