- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个包含原子字段的结构:
#include <stdatomic.h>
struct s {
...
atomic_int a;
};
这个结构是用calloc
分配的:
struct s *p = calloc(1, sizeof(struct s));
期望 p->a
初始化为 0 是否可移植?代码中有足够的障碍,因此弱一致性初始化是可以的,但初始值是否保证为 0?
最佳答案
不,这通常是不可移植的。 calloc
仅保证基础对象的字节级 0
值。对于(可能)具有状态的类型,这不等同于初始化。您肯定必须使用 atomic_init
将您的对象置于有效状态。
这是因为除了基本对象之外还持有“锁”的平台,因为它们没有实现相应的汇编程序指令。因此,为了便于移植,您确实需要对所有非静态分配的原子对象使用 ATOMIC_VAR_INIT
或 atomic_init
。
就是说,我不知道有任何现有平台需要这样的 atomic_int
。如果您的平台将 ATOMIC_INT_LOCK_FREE
设置为 2
并且 sizeof(atomic_int)==sizeof(int)
,您可以相对确定您的策略有效.您可以在 _Static_assert
中对其进行测试。
关于C11 stdatomic 和 calloc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30535262/
我用 stdatomic 创建了一个类似互斥锁的锁定函数,基本上可以做到这一点 do atomic_store(&zero, 0); while (!atomic_compare_exchange_w
第一个问题 我在cppreference上找到 _Atomic(类型名称)(自 C11 起) 用作类型说明符;这指定了一个新的原子类型 _Atomic 类型名称 (2)(自 C11 起) 用作类型限定
我有一个包含原子字段的结构: #include struct s { ... atomic_int a; }; 这个结构是用calloc分配的: struct s *p = call
我开发了一个多线程程序,它依赖于 stdatomic.h 中 atomic_int、atomic_store 和 atomic_load 的可用性。该程序使用 GCC 编译。 现在,我尝试在几个缺少
ISO/IEC 9899:2011 (E): 6.10.2.5 The implementation may ignore distinctions of alphabetical case and
我从SO线程here和here中了解到,假设在操作系统/硬件级别上多线程应用程序中的数据读写是原子的,这是不安全的,并且可能导致数据损坏。我想知道使用int C11库和Linux上的GCC编译器使变量
似乎 Xcode 5 和更高版本支持 C11,但是当我尝试包含 stdatomic.h 时它说找不到文件?是否可以在 Xcode 中使用 C11 原子结构? 最佳答案 stdatomic.h 在 Xc
在 GCC 中,这样的东西可以编译并且可能像预期的那样工作: #include #include #include #include int main(int argc, char **arg
我想利用 C11 标准提供的新原子操作。但是,尝试 #include 适当的头文件给了我这个: csort-par.c:5:23: fatal error: stdatomic.h: No such
使用 atomic_store 存储的数据和使用 atomic_load 加载的数据是否始终保持一致? 具体来说:C11 程序访问故意放置在现代 Intel CPU 缓存行之间边界上的 64 位数据。
我知道 C11 标准只有一个月的时间,但是 _Atomic 的草案要早得多。我还知道 GCC 编译器会在标准正式批准之前认真努力地实现这些功能。但即使there支持尚未准备好进入黄金时段。 但是,我也
我可以使用 #include 吗?和 atomic_thread_fence() 与 memory_order 来自 Linux 驱动程序(内核空间)中的 C11,还是我必须使用内存屏障的 Linu
我是一名优秀的程序员,十分优秀!