condition_variable.notify是同步点吗
Is condition_variable.notify a synchronization point?
假设我有这样的东西:
bool signalled = false;
std::condition_variable cv;
void thread1() {
while (true) {
std::unique_lock l(mutex);
cv.wait_until(l, [] { return signalled; });
return;
}
}
void thread2...N() {
signalled = true;
cv.notify_all();
}
这被认为是线程安全的吗?布尔值可以在许多线程中设置为true以中断线程1。
编辑:如果不是线程安全的,我正在寻找比赛条件的描述,这样我就可以更好地理解潜在的问题,并填补知识空白。
在不同步的情况下写入非原子变量是UB。然而,将signalled
设为atomic<bool>
并不能解决问题。
std::condition_variable
上的C++引用读取:
即使共享变量是原子变量,也必须在互斥对象下对其进行修改,以便将修改正确地发布到等待线程。
您应该这样做:
bool signalled = false;
void thread2...N()
{
std::unique_lock l(mutex);
signalled = true;
cv.notify_all();
}
相关问题:
- 互斥保护std::condition_variable
- 如果未在互斥对象下修改共享原子变量,则不会正确发布该变量
- 为什么我需要获取一个锁来修改共享的";原子";通知condition_variable之前的变量
相关文章:
- 松弛原子与无同步情况下的记忆连贯性
- 使用QQuickFramebufferObject时同步数据的最佳方式是什么
- 在C++中同步线程
- 与 stdio 同步是否使程序 I/O 非交互式?
- 如何在qt中同步应用程序和显示器的刷新率?
- Windows 进程间同步类似事件?
- 当对套接字 send() 的同步调用由于连接另一端丢失而被阻止时,如何恢复?
- 将 10 个线程与原子布尔值同步
- ofstream::close() 是否在 Linux 上调用同步?
- 与Visual Studios(c ++)同步时如何组织github存储库?
- 原子获取是否与互斥锁释放同步?
- Boost (Beast) websocket:同步写入挂起
- Postgres vs MySQL:命令不同步;.
- 线程过程中的线程同步问题
- 同步读取多个 TCP 响应
- 同步两个具有不同帧速率的传感器
- 如何定期同步线程?
- 同步对多个向量进行排序
- 同步类中的公共变量
- condition_variable.notify是同步点吗