首页 > 解决方案 > 对原子变量的非原子操作,反之亦然

问题描述

鉴于以下代码:

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.

标签: c++catomic

解决方案


如果要对非原子变量使用原子操作,可以使用std::atomic_ref (C++20)。你可以在这里看到一个例子。

您的第二个示例应该没问题,因为a_x它是具有memory_order_seq_cst内存模型的原子,并且+=定义为原子操作。


推荐阅读