让我有这样的 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 之前看到写入线程所做的所有更新(不仅仅是原子变量的更新)。
所以是的,这很好。