在多线程或 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/