条件変数の使用に関連するコードのデッドロックに問題があります。これは、純粋なコードの問題というよりも、設計上の問題です。正しい設計を理解すれば、実際にコードを書くことに問題はありません。次のシナリオがあります。
- スレッド A は条件変数を待機します。
- スレッド B が notify_all を呼び出し、スレッド A が起動します。
もちろん、これは私が望んでいることであり、すべてが期待どおりに機能するときに起こることです。ただし、代わりに次のシナリオが表示される場合があります。
- スレッド A は、条件変数の待機を開始する直前にコードを実行します。
- スレッド B は、スレッド A が待機していると考えて、notify_all を呼び出します。
- スレッド A は条件変数の待機を開始しますが、スレッド B が待機を停止するように指示したことを認識していません。デッドロック。
これを解決する最善の方法は何ですか? スレッド B でいつ notify_all を呼び出す必要があるかを知るために、スレッド A が実際に待機しているかどうかを確認する信頼できる方法が思いつきません。timed_lock に頼る必要がありますか? 私は嫌いです。