作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设我们有一个多线程 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/
我是一名优秀的程序员,十分优秀!