关于我在下面描述的顺序,我有一些相关的问题。
鉴于这些排序保证,我在很多地方都不需要明确的围栏。但是,我如何向编译器,特别是 GCC 表达“围栏”?也就是说,程序顺序的保证只适用于优化器不重新排序我的程序。
是否有通用/流行的新芯片具有不提供此类保证的通用内核?
我对 C++0x 的交错概念有点困惑。我必须使用“原子”类来利用这些保证,还是草案中的其他方面也提供了利用这些保证的方法?
内存排序
Intel 和 AMD,至少对于 x86_64,都保证内存加载相对于在单个处理器上完成的存储操作是连续的。也就是说,如果某个处理器执行这些存储:
- 商店 A <- 1
- 商店 B <- 2
- 商店 C <- 3
在其他处理器看到 C(3) 的那一刻,它保证也看到以前的存储 A(1) 和 B(2)。现在,处理器之间的可见性可能是交错的,但来自任何给定处理器的存储顺序也将是连续的。
当处理器 0 读取处理器 1 存储的值,然后写入一个值时,它们还具有传递保证,即处理器 2 读取新值也必须从处理器 1 中看到该值。
忽略处理 IO 和特殊设备的特殊情况。我只对一般的内存保证感兴趣:我在这里的排序只是我最感兴趣的一点,因为它对并发算法最重要。