C++11 我可以确保 condition_variable.wait() 不会错过通知吗?
C++11 Can I ensure a condition_variable.wait() won't miss a notification?
我让线程1执行以下代码:
unique_lock<mutex> ul(m);
while(condition == true)
cv.wait(ul);
执行此代码的线程2:
condition = false;
cv.notify_one();
不幸的是,我遇到了一个时间问题:
T1: condition checks true
T2: condition set to false
T2: cv.notify_one()
T1: cv.wait()
线程1完全错过了通知,并在wait()上保持阻塞状态。我尝试使用wait()的版本,它接受一个谓词,但结果基本相同。也就是说,谓词的主体执行检查,但在返回之前,条件的值会发生更改,并发送通知。然后谓词返回。
我该怎么解决这个问题?
您应该通过让线程2在更改标志之前锁定条件的互斥来修复这种竞争条件。
您正在描述一个典型的竞赛条件,该条件适用于未受保护的标志和条件。这些竞争条件是条件使用中互斥锁模式的原因。简单地说,总是有一个互斥对象来保护检查条件值时所涉及的变量。
在线程2的代码中:
unique_lock<mutex> ul(m);
condition = false;
cv.notify_one();
由于对condition
的读/写访问存在冲突,因此存在数据竞争。这意味着程序的行为没有定义。
cv
上的比赛条件是你最不担心的:这个程序可以做任何事情!
相关文章:
- 函数如何通知用户它基于函数原型抛出异常?
- 如何在ECS框架中更新组件数据和通知系统
- 当 I2C 值在C++中发生变化时收到通知
- 如何设计具有不同类型的通知和观察器的观察者模式?
- 当可输入框在窗口中处于活动状态时获得通知的任何方法
- 是否有必要获取锁并在不需要唤醒线程时通知condition_variable?
- 如何在点击通知时捕获用户的点击操作
- 在通知提升间处理条件变量时未按住锁会导致问题
- 从 C++ 运行的进程偶尔会错过某个选项
- 通知条件变量后使用互斥锁
- 如何在不设置值的情况下通知 c++ 未来?
- 使用 ISdigit 通知任何检测到的非法字符
- Qt:如何通知对象已建立涉及它的信号槽连接
- 提升进程间named_condition_any不通知
- Windows Toast 通知不适用于 MS CPP 示例代码
- C++ Poco - 如何创建通知队列的向量?
- gcc 是否在 2 条短裤的过度对齐结构的比较中错过了优化机会?
- 当通知迭代器参数初始化为空列表的开头时,list::insert 行为是什么?
- C++ - 如何不错过来自多个线程的多个通知?
- C++11 我可以确保 condition_variable.wait() 不会错过通知吗?