原子/非原子混合,任何保证



让我有这样的 GUI 线程:

std::vector<int> vec;
std::atomic<bool> data_ready{false};
std::thread th([&data_ready, &vec]() {
   //we get data
   vec.push_back(something);
   data_ready = true;
});
draw_progress_dialog();
while (!data_ready) {
  process_not_user_events();
  sleep_a_little();
}
//is it here safe to use vec?

如您所见,我没有通过任何类型的锁保护"vec",但我不会同时在两个线程中使用"vec",唯一的问题是内存访问重新排序,

根据 C++11 标准,"vec"中的某些修改是否不可能发生在"data_ready = true;"之后?

从文档中不清楚(对我来说),它是否仅与其他原子组学相关。

另外一个问题,是"默认"内存顺序是我想要的,还是必须改变内存模型?

只要您使用的内存顺序至少是获取/释放(这是默认值),您就可以保证在将标志设置为 true 之前看到写入线程所做的所有更新(不仅仅是原子变量的更新)。

所以是的,这很好。

相关内容

  • 没有找到相关文章

最新更新