比较交换原子操作vs加载链接/存储条件操作



在x86处理器下,我不确定比较-交换原子操作和Load-link/store-conditional操作之间的区别。后者比前者更安全吗?是第一种比第二种好吗?

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

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

比较-交换操作类似于CompareExchange,不同之处在于它不报告读取了什么值——仅仅报告读取的值是否与比较值匹配。请注意,CompareExchange可以通过报告从内存中读取的值是否与指定的比较值匹配来实现比较和交换。

LL/SC组合允许存储操作取决于自目标值加载以来是否存在外部影响。特别是,它保证如果存储成功,则外部代码根本没有写入位置。即使外部代码编写了一个新值,然后重新编写了原始值,也肯定会导致条件代码失败。从概念上讲,这可能使LL/SC看起来比其他方法更强大,因为它不会有"ABA"问题。不幸的是,LL/SC语义允许存储自发失败,并且随着加载和存储之间代码的复杂性增加,自发失败的概率可能会迅速上升。虽然使用LL/SC直接实现原子增量比使用它实现比较与交换,然后使用比较与交换实现原子增量更有效,但在需要在加载和存储之间做很多事情的情况下,通常应该使用LL-SC实现比较与交换,然后在load-modify- compareandswap循环中使用比较与交换方法。

在这三个原语中,比较与交换是最不强大的,但它可以通过其他两个原语中的任何一个实现。CompareAndSwap可以很好地模拟CompareExchange,尽管在某些极端情况下,这种模拟可能会发生活动锁定。无论是comparareexchange还是Compare-And-Swap都不能提供像LL-SC那样强大的保证,尽管可以可靠地放置在LL/SC循环中的有限代码数量限制了其保证的有用性。

x86不提供LL/SC指令。查看维基百科上的平台。

最新更新