首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >纯int上的stdatomic.h函数-产生未定义的或实现定义的行为?

纯int上的stdatomic.h函数-产生未定义的或实现定义的行为?
EN

Stack Overflow用户
提问于 2019-10-20 08:46:01
回答 1查看 291关注 0票数 3

对于GCC来说,这样的东西可以编译,而且可能会像预期的那样工作:

代码语言:javascript
复制
#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)

EN

回答 1

Stack Overflow用户

发布于 2019-11-05 21:01:38

不将_Atomic类型用于原子函数肯定是未定义的行为。我一点也不惊讶编译器没有抱怨,但是C非常宽容。当多个线程同时修改相同的内存位置时,原子函数为它们的行为提供了非常具体的保证。您的简单示例并没有实际说明这一点。

阅读原子类型的描述

原子类型的对象是唯一不受数据竞争的对象,也就是说,它们可以由两个线程并发修改,或者由一个线程修改,然后由另一个线程读取。

通过不使用原子类型,您不再能够以原子方式访问这些值,从而使原子函数变得无用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58471341

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档