C中的原子结构?

Atomic structure in C?

我想制作一个小型 C 结构的全部内容 atomic,但 the documentation 似乎表明只有原始数据类型作为结构中的字段才能成为原子。

比如我想做的:

#include <stdint.h>
#include <stdbool.h>
#include <stdatomic.h>

typedef struct my_obj_s {
  int16_t a;
  int16_t b;
  bool is_initialized;
} my_obj_t;

_Atomic my_obj_t my_atomic_object;

但似乎只能做到:

typedef struct my_obj_s {
  atomic_char16_t a;
  atomic_char16_t b;
  atomic_bool is_initialized;
} my_obj_t;

有没有办法在大于原始数据类型的任何东西上实现原子性(locks/mutexes/etc 中缺少括号 reads/writes)?

是的,您可以对结构使用 _Atomic 限定符。

使用这些结构,您基本上只能通过 atomic_... 类型的泛型函数(或通过结构分配)访问受限的可能性,您无法访问各个字段。这些函数中最有用的可能是 atomic_compare_exchange_weak.

如果您的结构不适合宽寄存器,平台通常通过使用某种存储在结构外部的锁来实现这些原子类型。如果是这样,他们将使用平台的本机功能。这些属性可能取决于您的编译器选项,特别是您必须确保所有编译对象的这些属性都相同。

对于 gcc 通常 -march=native 会触发最佳功能,例如使用 128 位原生原子(如果可用)。