gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 12:52:42 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com