比较和交换原子操作与负载链接/存储条件操作

Gui*_*e07 9 c++ atomic compare-and-swap

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

sup*_*cat 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循环中可靠地放置的有限数量的代码限制了其保证的有用性.


Nik*_*sov 7

x86不提供LL/SC指令.查看维基百科的平台.另见这个问题.