gpt4 book ai didi

c++ - condition_variable 并不总是有效

转载 作者:太空宇宙 更新时间:2023-11-04 16:05:52 26 4
gpt4 key购买 nike

似乎 condition_variable notify_one 并不总是按应有的方式工作。

struct Task {
std::mutex mutex;
std::condition_variable cv;
std::atomic_bool launch{false};
};
void job(Task& task) {
std::unique_lock<std::mutex> lock{task.mutex};
task.cv.wait(lock, [&]{ return task.launch == true; });
}
int main() {
for (auto i=0 ; i<1000*1000 ; i++) {
Task task;
std::thread thread{job, std::ref(task)};
task.launch = true;
task.cv.notify_one();
thread.join();
}
}

这个程序几乎永远不会到达终点,它在绝大多数时间里永远停止在循环中。为什么会这样?

最佳答案

这里有两个错误:

  • 如果同步访问一个对象,则不需要该对象的原子类型。您的 atomic_bool 只会导致开销。
  • 如果你想同步访问 launch 标志,你需要在写入之前锁定它的互斥体。您不会在 main() 中执行此操作。

解释:

  1. main() 创建任务
  2. main() 创建thread
  3. job() 锁定互斥体
  4. job() 检查 launch,这是错误的
  5. main() 设置launch
  6. main() 向 CV 发送信号,无人接收
  7. job() 由于第4步launch的值等待CV

通常,第 3 步和第 6 步是原子的,因为任何其他线程在未锁定互斥量的情况下不应该触及 launch。由于那没有发生,因此允许发生依赖操作的交错,这最终导致了意外行为。

关于c++ - condition_variable 并不总是有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35670584/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com