假设我有一个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;”是否不可能发生?
对于我来说,文档中并不清楚,内存排序是否仅与其他原子有关。
另外一个问题是,“默认”内存顺序是否是我想要的,还是必须更改内存模型?
std::atomic<bool>
的变量肯定不能 - Ben Voigt