c - 通用原子 channel 也可与自定义结构一起使用

标签 c generics atomic

这个问题都是关于stdatomic.h .

比如说,我想要某种机制,允许我使用任何类型的数据(包括自定义struct)创建原子“ channel ”。我想象的是这样的:

struct chan {
  atomic_intptr_t ptr;
};

这个想法是让 _Atomic intptr_t 能够保存对任何类型数据的引用。

然后让我们想象一下我有自定义数据...

struct person {
  char * name;
};

...我通过我的原子 channel 发布它:

struct person bob = {
    .name = "Bob"
};

struct person alice = {
    .name = "Alice"
};

struct chan c = {
    .ptr = &bob
};

鉴于此,以下代码是我将新数据推送到我的 channel 的多种方法之一:

atomic_exchange(&c.ptr, &alice); 

它有效,但 gcc 警告我:

warning: initialization of ‘atomic_intptr_t’ {aka ‘long int’} from ‘struct person *’ makes integer from pointer without a cast [-Wint-conversion]

所以感觉我采取了错误的方法。

让通用 channel 能够自动交换任何类型的数据的更好方法是什么? _Generic 可以提供帮助吗?

最佳答案

指针也可以被声明为_Atomic,所以我认为这里你想要的只是一个void *,它是原子的。 (也许您因缺少 convenience typedef 而被误导,但它工作正常,并且原子指针在大多数常见平台上都是无锁的。)因此:

#include <stdatomic.h>
struct chan {
    void * _Atomic ptr;
} c;

struct person {
  char * name;
} alice;

int some_integer = 8;

void add_some_stuff(void) {
    atomic_exchange(&c.ptr, &alice);
    // ...
    atomic_exchange(&c.ptr, &some_integer);
    // ...
    atomic_exchange(&c.ptr, NULL);
}

See on godbolt

关于c - 通用原子 channel 也可与自定义结构一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66679556/

相关文章:

从本地网络(WinSock,C)与公共(public) IP 通信

linux - 嵌入式linux中rootfs中有多个源文件时如何构建?

c - 无效声明 (2)

c# - 如何指定一个泛型类型应该实现另一个泛型类型?

arrays - Swift 获取通用类型的数组

lua - Aerospike Record UDF 是原子的吗?

java - 什么是 C++ 11 原子库等同于 Java 的 AtomicMarkableReference<T>

c - 使 C 浮点文字 float (而不是 double )

java - Dagger 2注入(inject)通用接口(interface)实现

python - 以 "Secure"方式更新磁盘上的两个相关文件?