原子/非原子混合,有什么保证吗?

3

假设我有一个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;”是否不可能发生?

对于我来说,文档中并不清楚,内存排序是否仅与其他原子有关。

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

1个回答

2
只要您使用的内存顺序至少是 acquire/release(这是默认设置),您就可以保证在读取写入标志为 true 之前,您将看到写线程对所有更新(而不仅仅是原子变量的更新)所做的更改。所以,没问题。

1
@usr:类型为std::atomic<bool>的变量肯定不能 - Ben Voigt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接