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循环中可靠地放置的有限数量的代码限制了其保证的有用性.
| 归档时间: |
|
| 查看次数: |
4462 次 |
| 最近记录: |