代码之家  ›  专栏  ›  技术社区  ›  Candide Guevara Marino

C11混合原子和非原子访问变量

  •  2
  • Candide Guevara Marino  · 技术社区  · 7 年前

    int var = 0;
    var++;
    atomic_fetch_add(&var, 1);
    

    然而,这并不是用clang 4.0.1编译的:

    error: address argument to atomic operation must be a pointer to _Atomic type ('int *' invalid)
    atomic_fetch_add(&var, 1);
    

    我能找到的最佳解决方案是演员阵容:

    int var = 0;
    (*(int*)&var)++;
    atomic_fetch_add(&var, 1);
    

    2 回复  |  直到 7 年前
        1
  •  3
  •   Jens Gustedt    7 年前

    C11中有两个接口,允许您对限制较少的原子对象进行操作。

    atomic_init 为此。

    第二,如果在执行过程中,即使有几个线程,也需要较少的访问保证,那么可以使用限制较少的访问模式。也就是说你可以 atomic_fetch_and_add_explicit(&var, 1, memory_order_relaxed) . 这仍然保证您的访问是 不可分割的 (您希望从原子中获得的属性之一)但它不能保证另一个线程何时看到更新的值。

        2
  •  0
  •   supercat    7 年前

    C标准定义的抽象机器的存储视图与大多数真实机器截然不同。特别是,它不是将内存访问视为可以根据所需情况以各种不同方式执行的操作,而是认为每个对象支持一种读取,最多支持一种写入( const -限定对象不支持任何类型的写入);访问对象所需的读写类型取决于其类型。