在x86处理器下,我不确定比较和交换原子操作与加载链接/存储条件操作之间的区别。后者比前者更安全吗?是第一种情况比第二次更好吗?
答案 0 :(得分:12)
原子基元有三种常见的样式:Compare-Exchange,Load-Linked / Store-Conditional和Compare-And-Swap。
CompareExchange操作将自动读取内存位置,如果匹配比较值,则存储指定的新值。如果读取的值与比较值不匹配,则不会发生存储。在任何情况下,操作都会报告读取的原始值。
比较和交换操作类似于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循环中可靠地放置的有限数量的代码限制了其保证的有用性。
答案 1 :(得分:7)
x86不提供LL / SC指令。查看wikipedia了解有关的平台。另请参阅此SO question。