Microsoft提供的 InterlockedCompareExchange 功能用于执行原子比较和交换操作。还有一个 _InterlockedCompareExchange .

在x86这些都是实施使用 cmpxchg 指令。

然而,阅读过的文件在这三种方法,他们似乎并不同意对准要求。

英特尔的 参考手册 说什么关于准(其他 如果 对检查的启用和不对齐存参考了,生成异常)

我也看了 lock 前缀,其具体的国家

完整性的锁定的前缀 受影响的准的存储场。

(重点矿山)

所以,英特尔似乎是说,对准是无关紧要的。操作,将原子无论什么。

_InterlockedCompareExchange 固有的文件也没说什么关于准,但是 InterlockedCompareExchange 功能

的参数,这一功能必须对准上的一个32位的边界;否则,该功能将会出现不可预知的行为在多处理x86系统和任何非x86系统。

那么,什么了?是的准的要求 InterlockedCompareExchange 只是为了确保能将工作,即使在预486CPU是哪里的 cmpxchg 指令是不是?这似乎有可能根据上述信息,但是我想可以肯定之前,我要依赖它。:)

或是对准需要由ISA保证原子性,我只是在寻找错误的地方在英特尔的参考手册中?

有帮助吗?

解决方案

PDF你是引用 是从1999年显然已经过时。

最新的英特尔的文件, ,具体地说 卷-3A 告诉一个不同的故事。

例如,在一个核i7处理的,你仍然必须确保数据不不跨越缓线,或他人的作为不能保证原子.

在积3A、系统编程,用于x86/64英特尔明确指出:

8.1.1保证原子操作

该Intel486处理器(和较新的理由)可以保证下面 基本存储器操作,将一直进行自动:

  • 阅读或写字节
  • 阅读或写字盟在16位的边界
  • 阅读或写双字上对准一个32位的边界

奔腾处理器(和较新的理由)可以保证下面 额外存储器操作,将一直进行自动:

  • 阅读或写入一个四字盟在64位的边界
  • 16位访问以非缓存存储的地点适合的一个32位数据的巴士

P6家庭处理器(和新的处理,因为)保证以下 额外存储器操作将一直进行自动:

  • 不对齐的16,32和64位访问缓存存储器内一个高速缓存 线

访问缓存,分跨越缓线和边界页 不能保证原子通过英特尔的核心2Duo,英特尔原,英特尔的核心 二人,奔腾M、奔腾4,英特尔强,P6家庭,奔腾的,Intel486处理器。英特尔的核心2Duo,英特尔原子,英特尔的核心,奔腾M、奔腾4,英特尔强, P6和家庭处理器提供旅控制信号,允许外部存储器 子系统,使分裂的访问原子;然而,不结盟数据访问会 严重影响处理器的性能和应该避免的

其他提示

x86 需要对齐 cmpxchg 指令。但是,建议使用对齐以提高性能。这应该不足为奇,向后兼容意味着用14年前的手册编写的软件仍然可以在今天的处理器上运行。

为什么Microsoft要求对齐并不清楚他们的文档。它可能用于性能或支持RISC架构,或两者兼而有之。

  

英特尔® 64和IA-32架构软件开发人员手册
  第3卷(3A):系统编程指南
  2013年1月

     

8.1.2.2软件控制总线锁定

     

要明确强制LOCK语义,软件可以在使用LOCK前缀时使用以下说明来修改内存位置。 [...]

     

•交换指令(XADD,CMPXCHG和CMPXCHG8B)。
  • XCHG指令自动假设LOCK前缀   • [...]

     

[...]总线锁的完整性不受对齐的影响   记忆领域。遵循LOCK语义的总线周期数   必要时更新整个操作数。但是,建议   锁定的访问在其自然边界上对齐以获得更好的效果   系统性能:

     

• 8位访问的任何边界(锁定或其他)。
  •锁定字访问的16位边界。
  •锁定双字访问的32位边界。
  •锁定四字访问的64位边界。

请参阅这个问题:自然对齐对性能很重要,并且需要x64架构(所以它不仅仅是PRE-x86系统,而且也是POST-x86系统 - x64可能仍然是一个小众案例,但它毕竟越来越受欢迎;-);这可能就是微软根据需要对其进行记录的原因(很难找到有关MS是否决定通过启用对齐检查来解决对齐问题的文档 - 可能因Windows版本而异;通过在文档中声明需要对齐,MS保留了在某些版本的Windows中强制它的自由,即使它们没有强迫它在其他版本中。)

微软的Interlocked API也适用于ia64(虽然它仍然存在)。 ia64上没有锁定前缀,只有cmpxchg.acq和cmpxchg.rel指令(或者是fetchadd和其他类似的beasties),如果我没记错的话,这些都需要对齐。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top