stdatomic(C11),关于_Atomic类型

时间:2017-12-26 14:35:23

标签: c types atomic c11

第一个问题

我在cppreference上找到了

  • _Atomic ( type-name )(自C11起)

    用作类型说明符;这指定了一种新的原子类型

  • _Atomic type-name(2)(自C11起)

    用作类型限定符;这指定了type-name的原子版本。在此角色中,它可以与const,volatile和restrict混合使用,但与其他限定符不同,type-name的原子版本可能具有不同的大小,对齐和对象表示。

使用_Atomic(int)代替_Atomic int也是如此  保证它与int的大小相同吗?

第二个问题

_Atomic内使用限定符 例如:

_Atomic(volatile int)

引发错误,但是像这样使用它:

_Atomic(volatile _Atomic(int)*)

不;这是标准行为吗?

最后一个问题

我注意到原子函数(例如:atomic_storeatomic_loadatomic_compare_exchange_weak)在没有传递类型为_Atomic类型的情况下工作,我仍然可以管理竞争条件问题。 这是标准行为吗?是否有缺点或导致任何错误?

1 个答案:

答案 0 :(得分:4)

第一个问题:

C11 7.17.6p3

  

注意原子整数类型不需要的表示与其对应的常规类型具有相同的大小。它们应该尽可能具有相同的大小,因为它可以减少移植现有代码所需的工作量。

第二个问题:

C11 6.7.2.4p3

  

<强> [约束]

     

3原子类型说明符中的类型名称不应引用数组类型,函数类型,原子类型或限定类型。

volatile int是合格类型。违反了约束部分中的必须,因此编译器需要输出诊断消息。除此之外,这种结构的行为是不确定的。

第三个问题:

C11 7.17.1.p5

  

5在以下概要中:

     
      
  • A是指其中一种原子类型。
  •   

他们期望_Atomic类型。传入非原子变量,因此未定义行为。