【发布时间】:2010-01-28 23:31:48
【问题描述】:
我最近偶然发现了这个Wikipedia article。根据我在多线程方面的经验,我知道由于程序能够随时在线程之间切换线程而导致的众多问题。但是,我从来不知道编译器和硬件优化可以以保证对单线程工作但不一定对多线程工作的方式重新排序操作。谁能解释如何正确处理多线程环境中重新排序操作的可能性?
更新:我最初不小心链接到了Out-of-Order Execution 文章而不是Memory barrier 文章,它对问题有更好的解释。
【问题讨论】:
-
这是另一个并发代码问题的例子:drdobbs.com/go-parallel/article/…,这是一篇关于减少多线程程序争用和锁定的有趣文章(带有 24 核 cpu 的示例):drdobbs.com/hpc-high-performance-computing/212201163跨度>
-
您明确谈论多线程,但这对于任何类型的并发代码来说都是一个问题,例如,带有中断处理程序的代码和与内存映射硬件外围设备对话的代码。
-
简短的回答是您可能不需要担心。重新排序的唯一问题是当两个线程正在访问共享资源时,在这些情况下,您已经在使用包含内存屏障的锁定机制。也许有些编译器不能正确支持多处理,因此会进行愚蠢的优化,但唯一的答案是避免它们,或者至少禁用不好的调整。就是这样。
标签: multithreading