初始化atomic_flag

PSk*_*cik 5 c atomic c11 stdatomic atomicinteger

我有一个struct,叫它struct foo,我想在上面添加一个atomic_flag变量。到目前为止,我一直在研究calloc该结构,因为它主要需要零初始化。我应该如何初始化atomic_flag成员?

struct foo{
    //...
    atomic_flag a_flg;
    //...
};
struct foo *foop = calloc(1,sizeof *foop);
if(!foop) return -1;

//should I be giving up `calloc` (/`malloc`+`memset`) in favor of `malloc`+this?
*foop = (struct foo){ ATOMIC_FLAG_INIT };
Run Code Online (Sandbox Code Playgroud)

编辑:

我发现了Jens Gustedt的与此相关的DR#421,它建议将零/默认初始化仅用于s。我怎样才能知道它是否被接受?atomic_flag

Aco*_*orn 5

C11 标准在 7.17.8p4 上说:

atomic_flag未显式初始化的AnATOMIC_FLAG_INIT最初处于不确定状态。

并且没有指示atomic_flag类型是什么或其内容,因此归零在这里无济于事。

您需要使用宏或atomic_flag_clearatomic_flag_clear_explicit函数将其初始化为已知状态。

  • 谢谢。我也是这样读的,但对我来说似乎很尴尬。我发现这个 [DR#421](http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2148.htm#dr_421) by Jens Gustedt 建议零初始化应该只适用于原子标志,但它看起来没有被批准(或者已经批准?)。 (2认同)
  • @PSkocik:在实践中可能在任何真正的实现上(绝对是所有主流的 x86 和 ARM 编译器,如 gcc/clang/MSVC/ICC),它*确实*工作。`atomic_flag` 需要是无锁的,在正常的实现中,它实际上只是一个 1 字节的 `bool`。对其进行零初始化是安全的。当然,这是在支持其他类型的无锁原子操作的 CPU 上,最高可达至少寄存器宽度。(如果您不确定全零是否是 `atomic_flag` 的有效对象表示,请检查 asm 以了解它如何使用它。) (2认同)
  • @PSkocik,不,不幸的是它还没有被批准,只有`ATOMIC_VAR_INIT` 被批准了。当我们讨论这个问题时,我了解到一些平台似乎需要使用不同的初始化值,这取决于它们拥有的原子原语。用复合字面量初始化`malloc`ed 数据是一个好习惯,所以我建议你保持这样。 (2认同)