atomic_compare_exchange_strong_explicit()
功能采用两个memory_order
参数,即success
和failure
(与atomic_compare_exchange_weak_explicit()
一样)。取消选择C11 / C18标准,我发现success
和failure
的允许值为:
success = memory_order_relaxed failure = memory_order_relaxed
success = _release failure = _relaxed
success = _consume failure = _relaxed
or _consume
success = _acquire failure = _relaxed
or _acq_rel or _consume (?)
or _acquire
success = _seq_cst failure = _relaxed
or _consume (?)
or _acquire
or _seq_cst
标准还说:
此外,如果比较结果为真,则根据成功,如果比较结果为假,则根据以下值影响内存失败。这些操作是原子的读-修改-写操作(5.1.2.4)。
您的ARM,POWER-PC和其他“ LL / SC”设备执行Load-Link / Cmp / Store-Conditional序列以实现atomic-cmp-exchange,其中,Load-Link可能是或可能不是_ acquire] >,并且存储条件可能为_ release,也可能不是。
所以我可以理解:成功= _ acq_rel
和失败= _ acquire。我无法克服的是(其中包括):成功= _ acq_rel
和失败= _ relaxed。当然,为了实现_ acq_rel,Load-Link必须为_ acquire?如果cmp失败,那么确定降级到_ relaxed?为时已晚success
和failure
参数的组合的预期含义是什么(当它们不相等时?)>
[[我总是有可能被标准迷住了,事实上,failure
的存储顺序实际上只能是success
的存储顺序的一半。]
atomic_compare_exchange_strong_explicit()函数采用两个memory_order参数,即成功和失败(atomic_compare_exchange_weak_explicit()也是)。取消选择C11 / C18标准,我...
在某些ISA上的asm中实现获取负载的一种方法是普通负载其后
围栏,例如在ARMv8引入ldar
/ ldaxr
之前在PowerPC或ARM等ISA上运行。 如果失败顺序不包括获取,则可以跳过此更高版本的栅栏。