我不确定 c++11 中原子变量的内存排序保证如何影响对其他内存的操作。
假设我有一个线程定期调用写入函数来更新值,另一个线程调用读取函数来获取当前值。是否保证 d = value;
的效果不会在 a = version;
的效果之前看到,而会在 b = 的效果之前看到版本;
?
atomic<int> a {0};
atomic<int> b {0};
double d;
void write(int version, double value) {
a = version;
d = value;
b = version;
}
double read() {
int x,y;
double ret;
do {
x = b;
ret = d;
y = a;
} while (x != y);
return ret;
}
最佳答案
规则是,给定一个执行一次的write
线程,没有其他修改a
、b
或d
,
- 您可以随时从不同的线程读取
a
和b
,并且 - 如果您阅读
b
并看到其中存储了version
,那么- 你可以阅读
d
;和 - 您读取的内容将是
值
。
- 你可以阅读
请注意,第二部分是否为真取决于内存顺序;默认值 (memory_order_seq_cst
) 也是如此。
关于C++11 具有非原子变量的原子内存顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30490696/