5

关于我在下面描述的顺序,我有一些相关的问题。

  1. 鉴于这些排序保证,我在很多地方都不需要明确的围栏。但是,我如何向编译器,特别是 GCC 表达“围栏”?也就是说,程序顺序的保证只适用于优化器不重新排序我的程序。

  2. 是否有通用/流行的新芯片具有不提供此类保证的通用内核?

  3. 我对 C++0x 的交错概念有点困惑。我必须使用“原子”类来利用这些保证,还是草案中的其他方面也提供了利用这些保证的方法?


内存排序

Intel 和 AMD,至少对于 x86_64,都保证内存加载相对于在单个处理器上完成的存储操作是连续的。也就是说,如果某个处理器执行这些存储:

  1. 商店 A <- 1
  2. 商店 B <- 2
  3. 商店 C <- 3

在其他处理器看到 C(3) 的那一刻,它保证也看到以前的存储 A(1) 和 B(2)。现在,处理器之间的可见性可能是交错的,但来自任何给定处理器的存储顺序也将是连续的。

当处理器 0 读取处理器 1 存储的值,然后写入一个值时,它们还具有传递保证,即处理器 2 读取新值也必须从处理器 1 中看到该值。

忽略处理 IO 和特殊设备的特殊情况。我只对一般的内存保证感兴趣:我在这里的排序只是我最感兴趣的一点,因为它对并发算法最重要。

4

3 回答 3

2

掌握这些类型的操作对于构建 SMP 操作系统和与某些类型的硬件进行通信至关重要。Linux 内核文档提供了对该主题的出色概述以及内核使用的特定解决方案。我强烈建议查看他们的memory-barriers.txt文件。

于 2011-04-04T19:25:47.873 回答
0

为了最大程度地保证您的存储和加载将按照所需的顺序执行,您可能需要使用代码中的块并明确asm写出您的mov指令。

于 2011-04-04T19:27:21.307 回答
0

即使平台保证了顺序一致性,当多个线程访问同一个内存位置并且至少有一个线程写入其中时,您总是需要某种同步来防止出现竞争情况。C++0x 提供了三种方式来实现这种同步:

  1. 互斥 -std::mutex和相关类
  2. 原子变量 -std::atomic<T>
  3. 显式内存屏障 - std::atomic_thread_fence.

后两者接受一个内存顺序参数,允许在不保证顺序一致性的平台上提供额外的灵活性(仅限专家!),但这与 x86 无关。

于 2011-04-04T19:32:19.523 回答