gpt4 book ai didi

c++ - boost::condition_variable::notify_one() 的并发性

转载 作者:行者123 更新时间:2023-11-30 02:59:26 25 4
gpt4 key购买 nike

我有一个异步处理任务的“引擎”,对于一个任务,我想等到该任务被处理完。

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 值,可以用来实现这样的东西

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;
}

但并发仍然存在......我该如何解决这个问题?

最佳答案

由于条件变量不维护有关它们是否已发出信号的状态,因此您需要维护条件变量单独发出信号的任何可能原因的状态(在某些情况下,例如队列,条件变量发出信号的原因可以异步消失)。所以你的代码中可能有这样的东西:

boost::condition_variable cvWorkDone;
bool workdone = false;

DoSomeWork()
{
PostAsyncJob(DoWorkAsync) // is a boost::asio::post

boost::mutex::scoped_lock lock(mtxWorkDoneCv);
while (!workdone) {
cvWorkDone.wait(lock);
}
}


DoWorkAsync()
{
// do some work ...

{
boost::mutex::scoped_lock lock(mtxWorkDoneCv);
workdone = true;
}
cvWorkDone.notify_one();
}

请注意,这还可以防止来自 boost::condition_variable::wait() 的虚假返回。来自 boost::condition_variable::wait() 上的 boost 文档:

The thread will unblock when notified by a call to this->notify_one() or this->notify_all(), or spuriously.

关于c++ - boost::condition_variable::notify_one() 的并发性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12896670/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com