gpt4 book ai didi

多线程和乱序执行

转载 作者:行者123 更新时间:2023-12-04 23:48:05 24 4
gpt4 key购买 nike

假设我们有一个多线程 C 程序(pthreads),并且各个线程的(非同步)共享变量访问没有被编译器重新排序。 x86 CPU 是否尊重共享变量访问的顺序(在单个线程内),或者它是否可能对某些内存访问进行重新排序?

最佳答案

不同步的共享变量访问是危险的,乱序是其原因之一。
x86 保持按顺序写入(在线程内),但不按顺序读取。

如果您假设订单仍然存在,这可能会给您带来麻烦。例如:
线程 A 写入 x 然后写入 y。假设编译器没有重新排序,cpu 不会重新排序(x86 不会,其他人可能会)。
线程 B 读取 y,然后读取 x。你可能认为如果它得到了 y 的新值,那么你肯定也会得到 x 的新值。
不是这样。 CPU 可能会对线程 B 的读取重新排序,因此实际上会更早读取 y。

编辑 :正如“Man of One Way”指出的那样,在这种情况下,x86(但不是所有处理器!)保证排序。
我引用英特尔软件开发人员手册:

Writes by a single processor are observed in the same order by all processors.



对于多个处理器的写入而言,情况并非如此——它们似乎被不同的处理器以不同的方式排序。

但是,我强烈建议不要依赖它,而是使用适当的同步。
同步原语是通过原子操作和/或屏障实现的,这可以保证您的安全。

关于多线程和乱序执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8591074/

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