我有一个异步处理任务的“引擎”,对于一个任务,我想等到该任务处理完毕。
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
有第二个参数,一个布尔值,可以用来实现这样的东西
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;
}
但并发性仍然存在......我该如何解决这个问题?