【问题标题】:Atomic structure in C?C中的原子结构?
【发布时间】:2019-08-27 19:32:08
【问题描述】:

我想制作一个小型 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 用于结构。

标签: c atomic c11


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2011-07-26
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-25
    相关资源
    最近更新 更多