每个美好的一天,每个开发人员或工程师,
关于“有效的现代C ++”第266页的问题,我回来找您。
Scott Meyers医生在第一段的第二行写道:
“ 不管反应任务是否在检测任务通知之前等待,它都起作用”
一段时间以来,我一直在考虑它,我无法证明其合理性。
您能不能向我解释为什么确切?
通常是https://en.cppreference.com/w/cpp/thread/condition_variable
写道,我们应该在接收到通知之前等待“等待”。以斯科特·迈耶斯(Scott Meyers)医生为例,根据他的说法,我们就不在这种情况下。
所以,我很感激有人向我详细解释。
std::condition_variable cv;
std::mutex m;
bool flag(false);
....
{
std::lock_guard<std::mutex> g(m);
flag=true;
}
cv.notify_one();
.....
and the reactig task :
...
{
std::unique_lock<std::mutex> lk(m);
cv.wait(lk,[]{return flag;});
...
}
答案 0 :(得分:2)
cv.wait(lk,[]{return flag;});
是关键行。
这必须等效于:
while(!pred())
{
cv.wait(lk);
}
其中pred
是您的行[]{return flag;}
这里请注意,即使在考虑等待之前,总是要检查谓词。这意味着,如果第一个任务完成并且没有通知任何人,那么那没关系-响应性任务出现,获取锁并检查flag
并将其设置为true甚至不会尝试执行wait
。
要了解的最后一件事是,在保持锁的同时执行了谓词检查和随后的等待(如果需要),因此在谓词的调用与原始线程可以进行的等待之间不会存在竞争条件溜进去。