pthread_cond_signal
シグナリングスレッドが述語の真理値に影響を与える状態を変更し、条件変数に関連付けられたミューテックスを保持せずに呼び出す状況で条件変数が使用されると仮定しますか?このタイプの使用法は、信号が失われる可能性のある競合状態に常にさらされているというのは本当ですか?
私には、常に明らかな競争があるように思われます。
- ウェイターは述語をfalseと評価しますが、待機を開始する前に...
- 別のスレッドは、述語を真にする方法で状態を変更します。
- 他のスレッドはを呼び出しますが
pthread_cond_signal
、ウェイターがまだいないため、何もしません。 - ウェイタースレッドは
pthread_cond_wait
、述語が真であることに気付かずに入り、無期限に待機します。
pthread_cond_signal
しかし、(A)状態を変更している間だけでなく、呼び出し中にミューテックスが保持されるように、または(B)状態を変更している間ミューテックスが保持されるように状況が変更された場合、これと同じ種類の競合状態が常に存在しますか?呼び出している間だけではありませんpthread_cond_signal
か?
上記のベストプラクティスではない使用法の有効な使用法があるかどうか、つまり、競合状態自体を回避するために正しい条件変数の実装でそのような使用法を考慮する必要があるかどうかを知りたいという観点から質問しています。それらはすでに本質的に競合しているため、無視できます。