交换交换原子操作与加载链接/存储条件操作

问题描述 投票:10回答:2

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

c++ atomic compare-and-swap load-link-store-conditional
2个回答
7
投票

x86不提供LL / SC指令。请查看wikipedia以了解适用的平台。另请参见此SO question


13
投票

原子基元的三种常见样式:Compare-Exchange,Load-Linked / Store-Conditional和Compare-And-Swap。

CompareExchange操作将从原子上读取内存位置,如果它与比较值匹配,则存储指定的新值。如果读取的值与比较值不匹配,则不会进行存储。无论如何,该操作都会报告读取的原始值。

Compare-And-Swap操作类似于CompareExchange,不同之处在于它不报告读取了什么值-只是读取的值是否与比较值匹配。请注意,通过使CompareExchange报告从内存中读取的值是否与指定的比较值匹配,它可以用于实现Compare-And-Swap。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.