このコードは、プロデューサのvoid push(data)
内部のミューテックスを待つでしょうか?このようなブースト条件コードの使用に問題はありますか?
もしそうなら、どのように回避できますか?
boost::mutex access;
boost::condition cond;
// consumer
data read()
{
boost::mutex::scoped_lock lock(access);
// this blocks until the data is ready
cond.wait(lock);
// queue is ready
return data_from_queue();
}
// producer
void push(data)
{
//<--- will a block ever happen here?
boost::mutex::scoped_lock lock(access);
// add data to queue
cond.notify_one();
}
私は(;;)ループ用のスレッドプールを持っていて、このプール内のスレッドからread()を呼び出すとします。その後、私はそれに関するデータを処理します。私はいくつかの外部スレッドでpush()を呼び出します。私の質問は、その外部スレッドは、プッシュ(データ)の呼び出しでブロックすることができますか?
これは当てはまりません。 void push(data)は、waitが呼び出されるまでブロックされません。ミューテックスを取得できない場合にのみブロックされ、他の誰かがミューテックスを解放するまで待たなければなりません。 データ読み取り()関数は、実際に待ち行列に項目があるかどうかをチェックしなければなりません(wait()を呼び出していない間に項目が追加されたか、または偽の起床が発生した可能性があります)。関数は "while(キューは空)cond.wait(ロック); return data_from_queue();" – nos