如果我有一个类型
enum foo {
FOO,
BAR,
BAZ,
};然后,我可以声明那种类型的原子版本吗?
_Atomic(enum foo);还是我必须使用例如atomic_int并转换atomic_load()的结果
以下程序不带警告地编译:
#include <stdatomic.h>
#include <stdio.h>
enum foo {FOO, BAR, BAZ};
int main(void) {
_Atomic(enum foo) foo_a;
atomic_store(&foo_a, BAR);
enum foo val = atomic_load(&foo_a);
printf("%u\n", val);
return 0;
}但也是如此:
#include <stdatomic.h>
#include <stdio.h>
enum foo {FOO, BAR, BAZ};
int main(void) {
enum foo foo; // <---- non atomic
atomic_store(&foo, BAR);
enum foo val = atomic_load(&foo);
printf("%u\n", val);
return 0;
}发布于 2019-03-05 20:10:58
是的,所有数据类型都可以是原子的,并且不需要为此使用原子泛型函数。然后,使用这样一个对象的所有操作都是原子的。
对于第二个例子,编译器不发出警告是很奇怪的。在原子操作中使用非原子操作是违反约束的,所以编译器应该给您一个诊断。
发布于 2019-03-05 22:51:38
是的这是合法的。顺便说一句,你实际上不需要父母,_Atomic enum foo foo;是等价的。
_Atomic与其他类型限定符(如const和volatile )一样工作。
enum foo foo;
atomic_store(&foo, BAR);是clang的一个错误。error: address argument to atomic operation must be a pointer to _Atomic type ('enum foo *' invalid)。(来自戈德波特编译器浏览器. )
GCC的实现只是一个怪癖,它在编译时甚至没有警告,甚至在-Wall也是如此。也许应该改变一下..。
像GCC原子结构一样,void __atomic_store_n (type *ptr, type val, int memorder)使用指向普通类型的指针,而不需要_Atomic。
C++11 <atomic>使用这些内置程序。类似地,GCC的C11 stdatomic.h使用
#define atomic_store_explicit(PTR, VAL, MO) \
__extension__ \
({ \
__auto_type __atomic_store_ptr = (PTR); \
__typeof__ (*__atomic_store_ptr) __atomic_store_tmp = (VAL); \
__atomic_store (__atomic_store_ptr, &__atomic_store_tmp, (MO)); \
})
#define atomic_store(PTR, VAL) \
atomic_store_explicit (PTR, VAL, __ATOMIC_SEQ_CST)( __extension__用于GNU语句-表达式,其中x = {foo; bar;}的值为bar。)
因此,所有这些实际上都不要求指针类型具有_Atomic。
https://stackoverflow.com/questions/55010595
复制相似问题