gpt4 book ai didi

将指针转换为 _Atomic 指针和 _Atomic 大小

转载 作者:太空狗 更新时间:2023-10-29 15:03:18 32 4
gpt4 key购买 nike

根据我对标准的阅读, *(_Atomic TYPE*)&(TYPE){0} (换句话说,将指向非原子的指针转换为指向相应原子的指针并取消引用)不受支持。

如果 TYPE,gcc 和/或 clang 是否将其识别为扩展?是/不是无锁的? (问题一)

第二个相关问题:我的印象是如果 TYPE不能实现为无锁原子,需要在相应的 _Atomic TYPE 中嵌入锁.但是如果我做 TYPE一个较大的结构,然后在两个clanggcc它的大小与 _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 编译上面的片段, gcc 和 clang 都将结构及其原子变体保持在相同的大小,并且它们生成对名为 __atomic_store 的函数的调用。对于商店(通过与 -latomic 链接解决)。

如果 _Atomic 中没有嵌入锁,这是如何工作的?结构的版本? (问题二)

最佳答案

_Atomic 更改了 Clang 上某些特殊情况下的对齐方式,并且 GCC 将来也可能会得到修复(PR 65146)。在这些情况下,通过强制转换添加 _Atomic 不起作用(从 C 标准的角度来看这很好,因为它是未定义的行为,正如您所指出的)。

如果对齐是正确的,使用 __atomic 内置函数更合适,它正是为这个用例设计的:

如上所述,如果 ABI 为普通(非原子)类型提供的对齐方式不足,并且 _Atomic 会更改对齐方式(目前仅使用 Clang),这将不起作用。

这些内置函数也适用于非原子类型,因为它们使用外联锁。这也是使用相同机制的 _Atomic 类型不需要额外存储的原因。这意味着由于无意中共享锁而导致一些不必要的争用。这些锁是如何实现的是一个实现细节,可能会在 libatomic 的 future 版本中发生变化。

一般来说,对于具有涉及锁定的原子内置函数的类型,将它们与共享或别名内存映射一起使用是行不通的。这些内置函数也不是异步信号安全的。 (无论如何,所有这些功能在技术上都超出了 C 标准。)

关于将指针转换为 _Atomic 指针和 _Atomic 大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55299525/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com