cond_var.notify_one()
Boost スレッドを使用する単一のプロデューサー/単一のコンシューマー アプリケーションで、コンシューマー スレッドが を呼び出す前に、プロデューサー スレッドが を複数回呼び出すとどうなりcond_var.wait(lock)
ますか?
への各呼び出しが呼び出しと 1 対 1 で対応するように、追加の呼び出しをnotify_one
スタックしますか?.wait()
.notify_one()
編集同時キューを実装するための一般的に引用される例には、次のメソッドがあります。
void push(Data const& data)
{
boost::mutex::scoped_lock lock(the_mutex);
the_queue.push(data);
lock.unlock();
the_condition_variable.notify_one();
}
void wait_and_pop(Data& popped_value)
{
boost::mutex::scoped_lock lock(the_mutex);
while(the_queue.empty())
{
the_condition_variable.wait(lock);
}
popped_value=the_queue.front();
the_queue.pop();
}
私はいくつかの非常によく似たコードを使用しましたが、奇妙なメモリの増加を経験しました。これは、消費者スレッドが毎回起動しないことによって説明されるようです.notify_one()
(まだ他の作業で忙しいため)。原因。
コンシューマー スレッドがプロデューサー スレッドに追いつかない場合、このコードをスタックしないと失敗するように思われます。私の理論が正しければ、このコードを修正する方法についての提案をいただければ幸いです。