Atomic/not-atomic混,有保证吗?

Atomic/not-atomic mix, any guarantees?

让我有一个 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;" 之后吗?

文档中(对我而言)不清楚,内存排序是否仅与其他原子相关。

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

只要您使用的内存顺序至少为 acquire/release(这是默认值),您就可以保证看到写入线程在设置一旦可以读取写入就标记为 true。

所以是的,这很好。