gpt4 book ai didi

c++ - 比较和交换原子操作与加载链接/存储条件操作

转载 作者:可可西里 更新时间:2023-11-01 16:28:54 26 4
gpt4 key购买 nike

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

最佳答案

共有三种常见的原子原语样式: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 来实现比较和交换,然后在加载-修改-比较和交换循环中使用该比较和交换方法。

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

关于c++ - 比较和交换原子操作与加载链接/存储条件操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7069986/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com