条件変数の使用方法を理解しています (cv オブジェクトは変数でも条件を示すものでもないため、このコンストラクトの名前は IMO です)。したがって、次のようにBoost.Threadで標準的に設定されたスレッドのペアがあります。
bool awake = false;
boost::mutex sync;
boost::condition_variable cv;
void thread1()
{
boost::unique_lock<boost::mutex> lock1(sync);
while (!awake)
cv.wait(lock1);
lock1.unlock(); // this line actually not canonical, but why not?
// proceed...
}
void thread2()
{
//...
boost::unique_lock<boost::mutex> lock2;
awake = true;
lock2.unlock();
cv.notify_all();
}
私の質問は: thread2 は本当にへの割り当てを保護する必要がありawake
ますか? notify_all()
電話で十分だと思います。操作およびチェック対象のデータが単純な「続行可能」フラグ以上のものである場合、ミューテックスに値が表示されますが、ここではやり過ぎのように見えます。
二次的な質問は、コード フラグメントで尋ねられるものです。「データの処理」ステップの前に、スレッド 1 のロックがロック解除されていることが Boost のドキュメントに表示されないのはなぜですか?
編集: たぶん私の質問は本当に: この種の待機を実装するための CV よりもクリーンな構造はありますか?