反应任务在检测任务通知之前等待

Reacting task waits before the detecting task notifies

本文关键字:任务 通知 等待 检测      更新时间:2023-10-16

美好的一天,每个开发人员或工程师都有一个美好的世界,

我回来问你一个关于"有效的现代C++"第266页的问题

斯科特·迈耶斯医生在第一段的第2行写道:

" 无论反应任务是否在检测任务通知之前等待,它都有效">

正在考虑它,从一段时间开始,我无法证明它。

你能向我解释为什么吗

通常 https://en.cppreference.com/w/cpp/thread/condition_variable

写道,我们应该在收到通知之前等待"等待"。在斯科特·迈耶斯医生的例子中,根据他的说法,我们并不处于这种情况。

所以,我很感激有人向我详细解释。

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;});
...
}
cv.wait(lk,[]{return flag;});

这里的关键行。

这需要等效于:

while(!pred())
{
    cv.wait(lk);
}

pred在哪里是你的线路[]{return flag;}

请注意,在考虑等待之前,始终会检查谓词。这意味着,如果第一个任务完成并且没有通知任何人,那么这并不重要 - 反应性任务出现,获取锁并检查flag并看到它设置为 true 甚至不会尝试执行wait

最后要了解的是,谓词检查和后续等待(如果需要(都是在保持锁时执行的,因此对谓词的调用和原始线程可以滑入的等待之间不会存在争用条件。