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 位原生原子(如果可用)。
我想制作一个小型 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 位原生原子(如果可用)。