【发布时间】:2019-03-22 12:23:03
【问题描述】:
根据我对标准的阅读,
不支持*(_Atomic TYPE*)&(TYPE){0}(换句话说,将指向非原子的指针转换为指向相应原子的指针并取消引用)。
如果TYPE 是/不是无锁的,gcc 和/或 clang 是否将其识别为扩展? (问题一)
第二个相关问题:我的印象是,如果TYPE 不能实现为无锁原子,则需要在相应的_Atomic TYPE 中嵌入一个锁。但是如果我将TYPE 设为一个较大的结构,那么在clang 和gcc 上它的大小都与_Atomic TYPE 相同。
两个问题的代码:
#include <stdatomic.h>
#include <stdio.h>
#if STRUCT
typedef struct {
int x;
char bytes[50];
} TYPE;
#else
typedef int TYPE;
#endif
TYPE x;
void f (_Atomic TYPE *X)
{
*X = (TYPE){0};
}
void use_f()
{
f((_Atomic TYPE*)(&x));
}
#include <stdio.h>
int main()
{
printf("%zu %zu\n", sizeof(TYPE), sizeof(_Atomic TYPE));
}
现在,如果我用-DSTRUCT 编译上面的sn-p,gcc 和clang 都将结构及其原子变体保持在相同的大小,并且它们会生成对名为__atomic_store 的函数的调用store(通过链接-latomic解决)。
如果_Atomic 版本的结构中没有嵌入锁,这将如何工作? (问题2)
【问题讨论】: