- 主题:乱序执行的CPU怎么处理多线程中,共享变量有前后依赖的问题的?
比如:
线程1:
b=2;
a=1;
线程2:
while(a==1){
c=b;
}
如果a和b乱序了,线程2执行就不对了。
--
修改:wjhtingerx FROM 120.245.118.*
FROM 107.182.184.*
但实际开发过程中,好像大家基本都没理这茬,感觉也没出问题,这种到底是不是问题?
【 在 poggy 的大作中提到: 】
:
: 这种两个变量倚赖的, 需要使用原子变量的。
: 可能需要操作系统支持,windows平台有atomic变量操作的api提供。
: ...................
--
FROM 107.182.184.*
第一个是valotile的事,这个清楚。
第二个,ARM体系,这种怎么弄的,需要编程显示的做处理吗?
【 在 ArchLinux 的大作中提到: 】
: 这个涉及了两个问题,一个是编译的时候a和b的赋值顺序会不会因为指令调度和源码不同,第二个是你题目里问的关于memory consistency的问题。对于memory consistency的问题,不同体系结构定义的memory model不同,像x86的类似total store order(TSO)的模型可以保证store保序,而有的模型可能就需要手动加fence.
:
--
FROM 107.182.184.*
为啥增加d = b后,a更容易乱序?
我的疑问是,这种场景应该是很多的,但是实际开发中,知道这些的程序员其实很少的,为啥也没听说爆出啥大的问题呢
【 在 beanspower 的大作中提到: 】
:
: 乱序当然会发生,线程1如果改成:
: d = b
: ...................
--
FROM 107.182.184.*
这里回答很多是错的,volatile只约束编译结果,跟CPU的乱序执行无关。
【 在 z16166 的大作中提到: 】
: 这种基础问题,chatgpt回答得不错
:
: Q:
: ...................
--
FROM 107.182.184.*
问题这个场景不仅限于驱动或底层,在多线程数据传递共享方面,场景大量存在。我就没看过有谁注意到这个事,都是随便写,因为知道这个的就没几个人。但实际呢,我也没遇到过因为这个事导致的问题,我也干嵌入式软件快20年了,感觉挺奇怪的
【 在 beanspower 的大作中提到: 】
:
: 知道这个点不多是因为你的岗位接触的少。
: 如果你是一个嵌入式工程师,写过最简单的NOR FLASH驱动,就一定会遇到这种严格要求执行结果的case。因为一旦乱序,硬件就不work了。所以驱动代码中插入了很多barrier指令。
: ...................
--
FROM 107.182.184.*