编译器相关 - 这两个 C 代码真的相同吗?

标签 c multithreading compiler-construction rtos

在多线程或 RTOS 环境中,以下这些代码是否相同?

我相信他们不是。但是第一个代码绝对保存在多线程环境中吗?编译器是否有规则为“ga”分配一个寄存器,并且稍后在 func_a() 中不会再次读取“ga”?

我知道我可以使用锁,但这不是关于如何保护数据的问题。这只是关于编译器行为的问题。

//ga 是一个全局变量。

int func_a() {

    int a = ga;
    return a>2 ? a-2 : 2-a;
}

int func_b() {

    return ga>2 ? ga-2 : 2-ga;
}

我的意图是寻找一种标准方式(不是特定于平台的)来读取 ga 一次并将其值分配给局部变量“a”。

然后可以始终使用“a”,而不管“ga”是否已更改。

最佳答案

面对执行函数的多个线程,这两个版本的代码都具有未定义的行为。当然,不同的编译器可以对是否将全局变量保存到寄存器中做不同的事情。更重要的是,对于正在改变全局变量的线程,不能保证分配给局部变量可以以原子方式完成。

关于编译器相关 - 这两个 C 代码真的相同吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10313275/

相关文章:

c - 在不同级别使用不同的枚举类型

ios - 我们可以允许从两个线程同时操作 NSMutableArray 的不同 "indexes"

java - 表示给定范围内所有数字的最佳方式是什么? (一些限制)

javascript - asm.js 对编译器的限制

gcc - 为什么 Go 源码包含很多 .go 文件?它们是如何编译的?

c - 如何在 lib 错误中获取未解析的外部?

c++ - C中的返回值优化和复制省略

objective-c - LLVM 在编译前会做简单的算术运算吗?

java - i == (i = 2) 的结果是什么?

java - 我应该使用 Handler 还是 Thread?