gpt4 book ai didi

c++ - 为什么 fetch_add 使用锁定前缀而 fetch_and 在 boost atomics 中使用 cmpxchg

转载 作者:太空宇宙 更新时间:2023-11-04 13:34:27 27 4
gpt4 key购买 nike

我注意到在 fetch_add 的 boost::atomics 库 x86 实现(其中一个不使用编译器内部函数)中使用 add指令 lock前缀:

static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT
{
__asm__ __volatile__
(
"lock; xaddw %0, %1"
: "+q" (v), "+m" (storage)
:
: BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA "memory"
);
return v;
}

同时 fetch_and , fetch_orfetch_xor通过CAS指令实现:

#define BOOST_ATOMIC_DETAIL_CAS_LOOP(op, argument, result)\
__asm__ __volatile__\
(\
"xor %%" BOOST_ATOMIC_DETAIL_TEMP_CAS_REGISTER ", %%" BOOST_ATOMIC_DETAIL_TEMP_CAS_REGISTER "\n\t"\
".align 16\n\t"\
"1: movw %[arg], %%dx\n\t"\
op " %%ax, %%dx\n\t"\
"lock; cmpxchgw %%dx, %[storage]\n\t"\
"jne 1b"\
: [res] "+a" (result), [storage] "+m" (storage)\
: [arg] "q" (argument)\
: BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA BOOST_ATOMIC_DETAIL_TEMP_CAS_REGISTER, "memory"\
)

static BOOST_FORCEINLINE storage_type fetch_and(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT
{
storage_type res = storage;
BOOST_ATOMIC_DETAIL_CAS_LOOP("andw", v, res);
return res;
}

知道为什么会这样吗?这是因为您不能对按位运算使用锁定前缀(据我所知,这不是真的)吗?

最佳答案

正如 Jester 所指出的,fetch_add 使用 xadd 指令来返回函数效果之前的值。没有xandxor指令,所以使用CAS。

关于c++ - 为什么 fetch_add 使用锁定前缀而 fetch_and 在 boost atomics 中使用 cmpxchg,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30167140/

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