反应任务在检测任务通知之前等待
Reacting task waits before the detecting task notifies
美好的一天,每个开发人员或工程师都有一个美好的世界,
我回来问你一个关于"有效的现代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
。
最后要了解的是,谓词检查和后续等待(如果需要(都是在保持锁时执行的,因此对谓词的调用和原始线程可以滑入的等待之间不会存在争用条件。
相关文章:
- 有没有任务栏API可以立即应用注册表更改
- 函数如何通知用户它基于函数原型抛出异常?
- 如何在ECS框架中更新组件数据和通知系统
- 当 I2C 值在C++中发生变化时收到通知
- 如何创建线程序列以按照启动顺序执行任务?
- 如何设计具有不同类型的通知和观察器的观察者模式?
- C++一个线程如何正确通信其任务已完成?
- 在线程之间拆分任务总是值得的吗?
- 递归求和任务的错误答案
- 当可输入框在窗口中处于活动状态时获得通知的任何方法
- "main"函数堆栈中的对象在第一个任务运行时被覆盖 (FreeRTOS)
- C++ 任务流库入门
- 是否有必要获取锁并在不需要唤醒线程时通知condition_variable?
- 如何在点击通知时捕获用户的点击操作
- 在通知提升间处理条件变量时未按住锁会导致问题
- Pisarze - 来自波兰奥林匹克信息学的数据分析任务
- 通知条件变量后使用互斥锁
- 如何在不设置值的情况下通知 c++ 未来?
- 在程序运行时监视 VxWorks 中的任务 CPU 利用率
- 反应任务在检测任务通知之前等待