【问题标题】:non-atomic operations on atomic variables and vice versa [duplicate]对原子变量的非原子操作,反之亦然[重复]
【发布时间】: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:指向原子和非原子类型的指针彼此不兼容,因此将&amp;x 传递给atomic_fetch_add 无效。
  • 是的...是的,我做到了。

标签: c++ c atomic


【解决方案1】:

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

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

【讨论】:

猜你喜欢
  • 2020-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-13
  • 1970-01-01
  • 1970-01-01
  • 2013-02-13
相关资源
最近更新 更多