我有一个包含原子场的结构:
#include <stdatomic.h>
struct s {
...
atomic_int a;
};
Run Code Online (Sandbox Code Playgroud)
该结构分配有calloc:
struct s *p = calloc(1, sizeof(struct s));
Run Code Online (Sandbox Code Playgroud)
是否可以预期p->a初始化为0?代码中有足够的障碍,因此初始化很弱,但是初始值是否保证为0?
不,这通常是不可移植的。只保证底层对象的calloc字节值。0对于(可能)具有状态的类型,这并不等同于初始化。您绝对必须使用atomic_init将对象置于有效状态。
原因是除了基础对象之外,平台还持有“锁”,因为它们没有实现相应的汇编指令。因此,为了可移植,您确实需要对所有非静态分配的原子对象使用ATOMIC_VAR_INITor 。atomic_init
也就是说,我不知道有任何现有平台需要如此复杂的atomic_int. 如果您的平台已ATOMIC_INT_LOCK_FREE设置为2和sizeof(atomic_int)==sizeof(int),您可以相对确定您的策略有效。您可以在_Static_assert.
| 归档时间: |
|
| 查看次数: |
370 次 |
| 最近记录: |