我想让一个小的 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;
有没有办法在任何大于原始数据类型的东西上实现原子性(在锁/互斥锁/等中缺少括号读/写)?
是的,您可以对结构使用 _Atomic
限定符。
有了这些结构,您基本上只能通过 atomic_...
类型的泛型函数(或通过结构分配)访问受限的可能性,您无法访问各个字段。这些函数中最有用的可能是 atomic_compare_exchange_weak
。
如果您的结构不适合宽寄存器,平台通常会使用某种存储在结构外部的锁来实现这些原子类型。如果是这样,他们将使用平台的 native 功能。这些属性可能取决于您的编译器选项,特别是您必须确保所有编译对象的这些属性都相同。
对于 gcc
,通常 -march=native
会为此触发最佳功能,例如,如果可用,则使用 128 位 native 原子。
我是一名优秀的程序员,十分优秀!