condition_variable.notify是同步点吗

Is condition_variable.notify a synchronization point?

本文关键字:同步 notify variable condition      更新时间:2023-10-16

假设我有这样的东西:

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之前的变量