【发布时间】:2021-02-05 16:06:32
【问题描述】:
给定以下代码:
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;
}
或者结果不能保证,我不应该将原子操作与非原子类型混合,反之亦然?
PS:我在这里使用了 int 类型,但我的问题适用于任何类型 T 和 _Atomic T。
【问题讨论】:
-
您对
atomic_fetch_add()reference 有什么特别不清楚的地方? -
如果您在 C 和 C++ 之间进行选择,这更容易回答
-
它没有说明将原子变量与非原子操作混合在一起,反之亦然。 gcc 编译时没有任何警告。
-
tl;dr:指向原子和非原子类型的指针彼此不兼容,因此将
&x传递给atomic_fetch_add无效。 -
是的...是的,我做到了。