【发布时间】:2012-10-15 13:30:27
【问题描述】:
我有一个异步处理任务的“引擎”,对于一个任务,我想等到该任务处理完毕。
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() 在DoSomeWork() 等待之前通知boost::condition_variable 怎么办?
我看到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;
}
但并发仍然存在......我该如何解决这个问题?
【问题讨论】:
标签: c++ boost synchronization race-condition condition-variable