atomic_compare_exchange_strong_explicit()-当不相等时,成功和失败参数的各种组合会做什么?

问题描述 投票:1回答:1

atomic_compare_exchange_strong_explicit()功能采用两个memory_order参数,即successfailure(与atomic_compare_exchange_weak_explicit()一样)。取消选择C11 / C18标准,我发现successfailure的允许值为:

    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?为时已晚

successfailure参数的组合的预期含义是什么(当它们不相等时?)>

[[我总是有可能被标准迷住了,事实上,failure的存储顺序实际上只能是success的存储顺序的一半。]

atomic_compare_exchange_strong_explicit()函数采用两个memory_order参数,即成功和失败(atomic_compare_exchange_weak_explicit()也是)。取消选择C11 / C18标准,我...

c assembly atomic stdatomic
1个回答
2
投票

在某些ISA上的asm中实现获取负载的一种方法是普通负载其后

围栏,例如在ARMv8引入ldar / ldaxr之前在PowerPC或ARM等ISA上运行。 如果失败顺序不包括获取,则可以跳过此更高版本的栅栏。
© www.soinside.com 2019 - 2024. All rights reserved.