给定以下代码:
static int x;
static void f() {
for (int i = 0; i < 100; ++i)
atomic_fetch_add(&x, 3);
}
此外,假设f
被两个线程同时调用。C/C++内存模型是否保证在所有硬件平台上的结果始终是600
?
如果我将它更改为以下内容呢?在所有硬件平台上,结果是否仍然保证为600
?
static atomic_int a_x;
static void f() {
for (int i = 0; i < 100; ++i)
a_x += 3;
}
那么结果就不能保证,并且我不应该混合使用原子操作和非原子类型,反之亦然吗?
附注:这里我使用了int类型,但我的问题适用于任何类型T 和 _Atomic T。
atomic_fetch_add()
参考文献 中具体不清楚什么? - πάντα ῥεῖa_x == 100
。内置的自增、自减和复合赋值运算符是读取-修改-写入原子操作,具有完全顺序一致性排序。也就是说,a_x += 3
是一个原子操作。 - trent