【蓝因子教育】多线程下重排问题

2025-05-14ASPCMS社区 - fjmyhfvclm

比如下面的类中两个经典函数,如果 AB 线程分别同时执行不同的函数,

线程 A 对 12 指令重排,AB 线程执行顺序为 2-3-4-1。

线程 B 对 34 进行了指令重排,先读取 a 值为 0, 然后计算出 a*a= 0,临时存储下来,然后如果线程 A 执行完毕后导致 use 函数里的 i 最终是 0。

1 和 3 之间存在数据依赖关系,同时 2 和 3 之间也存在数据依赖关系。因此在最终执行的指令序列中,3 不能被重排序到 1 和 2 的前面(3 排到 1 和 2 的前面,程序的结果将会被改变)。但 1 和 2 之间没有数据依赖关系,编译器和处理器可以重排序 1 和 2 之间的执行顺序。asif-serial 语义使单线程下无需担心重排序的干扰,也无需担心内存可见性问题

全部评论