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。
所以是的,这很好。
让我有一个 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。
所以是的,这很好。