假设我有这样的事情:

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();
}

那被认为是线程安全的吗?在许多线程中,可以将 bool 值设置为true来中断thread1。

编辑:如果不是线程安全的,我正在寻找有关竞赛条件的描述,以便我可以更好地理解根本问题并填补知识空白。

最佳答案

无需同步即可写入非原子变量。但是,将signalled设置为atomic<bool>将无法解决问题。
std::condition_variable上的C++ reference读取:



你应该做这个:

bool signalled = false;

void thread2...N()
{
    std::unique_lock l(mutex);
    signalled = true;
    cv.notify_all();
}

相关问题:
  • Mutex protecting std::condition_variable
  • Shared atomic variable is not properly published if it is not modified under mutex
  • Why do I need to acquire a lock to modify a shared "atomic" variable before notifying condition_variable
  • 10-01 20:02