11

在 x86 处理器下,我不确定比较和交换原子操作和加载链接/存储条件操作之间的区别。后者比前者更安全吗?是不是第一个比第二个好?

4

2 回答 2

17

有三种常见的原子原语样式:比较交换、加载链接/存储条件和比较和交换。

CompareExchange 操作将自动读取内存位置,如果它与比较值匹配,则存储指定的新值。如果读取的值与比较值不匹配,则不进行存储。在任何情况下,操作都会报告读取的原始值。

Compare-And-Swap 操作类似于 CompareExchange,不同之处在于它不报告读取的值 - 仅报告读取的任何值是否与比较值匹配。请注意,CompareExchange 可用于实现 Compare-And-Swap,方法是让它报告从内存读取的值是否与指定的比较值匹配。

LL/SC 组合允许存储操作以某些外部影响是否可能影响目标为条件,因为它的值被加载。特别是,它保证如果存储成功,则该位置根本没有被外部代码写入。即使外部代码写入了一个新值,然后重新写入了原始值,也保证会导致条件代码失败。从概念上讲,这可能会使 LL/SC 看起来比其他方法更强大,因为它不会有“ABA”问题。不幸的是,LL/SC 语义允许存储自发失败,并且随着加载和存储之间代码复杂性的增加,自发失败的概率可能会迅速上升。

在这三个原语中,Compare-And-Swap 是最不强大的,但它可以根据其他两个中的任何一个来实现。CompareAndSwap 可以很好地模拟 CompareExchange,尽管在某些极端情况下,这种模拟可能会锁定。CompareExchange 和 Compare-And-Swap 都不能提供与 LL-SC 一样强大的保证,尽管可以可靠地放置在 LL/SC 循环中的有限代码量限制了其保证的有用性。

于 2013-03-11T20:25:19.523 回答
7

x86 不提供 LL/SC 指令。查看wikipedia上的平台。另请参阅此SO question

于 2011-08-15T20:48:39.010 回答