对于GCC来说,这样的东西可以编译,而且可能会像预期的那样工作:
#include <stdatomic.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
(void)argc;
int x = 23;
// XXX
// instead of:
// _Atomic int x = 23;
int exp = atoi(argv[1]);
int y = atoi(argv[2]);
printf("x = %d, exp = %d, y = %d\n", x, exp, y);
bool b = atomic_compare_exchange_strong(&x, &exp, y);
printf("x = %d, exp = %d, y = %d => %s\n", x, exp, y, b ? "true" : "false");
return 0;
}The C引用说明了这样的原子函数
这是为所有原子对象类型 A定义的泛型函数。参数是指向易失性原子类型的指针,以接受非易失性和易失性(例如内存映射的I/O)原子变量的地址。C是与A对应的非原子类型。
这意味着像atomic_compare_exchange_strong()这样的原子函数不是为非原子类型定义的。
由于int是一种非原子类型,上面的代码会产生未定义的行为吗?
还是C标准将此指定为实现定义的行为?
(其中一个实现也可以将int定义为原子类型,因此基本上相当于_Atomic int)
发布于 2019-11-05 21:01:38
不将_Atomic类型用于原子函数肯定是未定义的行为。我一点也不惊讶编译器没有抱怨,但是C非常宽容。当多个线程同时修改相同的内存位置时,原子函数为它们的行为提供了非常具体的保证。您的简单示例并没有实际说明这一点。
阅读原子类型的描述
原子类型的对象是唯一不受数据竞争的对象,也就是说,它们可以由两个线程并发修改,或者由一个线程修改,然后由另一个线程读取。
通过不使用原子类型,您不再能够以原子方式访问这些值,从而使原子函数变得无用。
https://stackoverflow.com/questions/58471341
复制相似问题