タスクを非同期的に処理する「エンジン」があり、1つのタスクについて、そのタスクが処理されるまで待機したいと思います。
boost::condition_variable cvWorkDone;
DoSomeWork()
{
PostAsyncJob(DoWorkAsync) // is a boost::asio::post
boost::mutex::scoped_lock lock(mtxWorkDoneCv);
cvWorkDone.wait(lock);
}
DoWorkAsync()
{
// do some work ...
cvWorkDone.notify_one();
}
問題は、上記のコードに競合状態があることです。前にそれを待つようにDoWorkAsync()
通知した場合はどうなりますか?boost::condition_variable
DoSomeWork()
boost::condition_variable::wait
これには2番目のパラメーター、このようなものを実装するために使用できるブール値があることがわかります
bool bWait;
DoSomeWork()
{
bWait = true;
PostAsyncJob(DoWorkAsync) // boost::asio::post
boost::mutex::scoped_lock lock(mtxWorkDoneCv);
cvWorkDone.wait(lock, bWait);
}
DoWorkAsync()
{
// do some work ...
boost::mutex::scoped_lock lock(mtxWorkDoneCv);
cvWorkDone.notify_one();
bWait = false;
}
しかし、並行性はまだあります...どうすればこれを解決できますか?