这个问题都是关于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);
}
关于c - 通用原子 channel 也可与自定义结构一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66679556/