也可与自定义结构一起使用的通用原子通道

Generic atomic channel that will work with custom structs as well

这个问题是关于 stdatomic.h

说,我想要一些机制,允许我使用任何类型的数据创建原子“通道”,包括自定义 structs。我想是这样的:

struct chan {
  atomic_intptr_t ptr;
};

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

然后假设我有自定义数据...

struct person {
  char * name;
};

...然后我通过我的原子频道发布它:

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

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

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

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

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]

所以感觉我走错了路

让通用通道能够自动交换任何类型的数据的更好方法是什么? _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