gpt4 book ai didi

c++ - atomic_flag是如何实现的?

转载 作者:行者123 更新时间:2023-12-01 22:08:34 25 4
gpt4 key购买 nike

atomic_flag是如何实现的?我觉得在 x86-64 上它无论如何都相当于atomic_bool,但这只是一个猜测。 x86-64 实现可能与arm 或x86 有所不同吗?

最佳答案

是的,在普通 CPU 上 atomic<bool>atomic<int>也是无锁的,它很像 atomic<bool> ,使用相同的指令。 (x86 和 x86-64 具有相同的可用原子操作集。)

您可能认为它总是使用 x86 lock btslock btr设置/重置(清除)单个位,但执行其他操作可能会更有效(特别是对于返回 bool 而不是在其上分支的函数)。该对象是一个完整的字节,因此您可以只存储或交换整个字节。 (如果 ABI 保证该值始终为 01 ,则在将结果返回为 bool 之前不必对其进行 bool 化)

GCC 和 clang 编译 test_and_set到字节交换,并清除到字节存储 0 . 我们得到了(几乎)相同的 atomic_flag 的汇编。 test_and_setf.exchange(true);

#include <atomic>

bool TAS(std::atomic_flag &f) {
return f.test_and_set();
}

bool TAS_bool(std::atomic<bool> &f) {
return f.exchange(true);
}


void clear(std::atomic_flag &f) {
//f = 0; // deleted
f.clear();
}

void clear_relaxed(std::atomic_flag &f) {
f.clear(std::memory_order_relaxed);
}

void bool_clear(std::atomic<bool> &f) {
f = false; // deleted
}

On Godbolt适用于带有 gcc 和 clang 的 x86-64,以及适用于 ARMv7 和 AArch64。

## GCC9.2 -O3 for x86-64
TAS(std::atomic_flag&):
mov eax, 1
xchg al, BYTE PTR [rdi]
ret
TAS_bool(std::atomic<bool>&):
mov eax, 1
xchg al, BYTE PTR [rdi]
test al, al
setne al # missed optimization, doesn't need to booleanize to 0/1
ret
clear(std::atomic_flag&):
mov BYTE PTR [rdi], 0
mfence # memory fence to drain store buffer before future loads
ret
clear_relaxed(std::atomic_flag&):
mov BYTE PTR [rdi], 0 # x86 stores are already mo_release, no barrier
ret
bool_clear(std::atomic<bool>&):
mov BYTE PTR [rdi], 0
mfence
ret

请注意xchg也是执行 seq_cst 的有效方法存储在 x86-64 上,通常比 mov 更高效+ mfence海湾合作委员会使用的。 Clang 使用xchg对于所有这些(休闲商店除外)。

有趣的是,在 atomic_flag.test_and_set() 中的 xchg 之后 clang 重新 bool 化为 0/1 ,但 GCC 在 atomic<bool> 之后执行此操作。 clang 做了一个奇怪的事情 and al,1在 TAS_bool 中,它将处理类似 2 的值为假。这似乎毫无意义; ABI 保证 bool在内存中始终存储为 01字节。

对于 ARM,我们有 ldrexb/strexb交换重试循环,或者只是 strb + dmb ish对于纯粹的商店。或者AArch64可以使用stlrb wzr, [x0]对于 clear或分配 false 来执行顺序释放存储(零寄存器),而不需要屏障。

关于c++ - atomic_flag是如何实现的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59601453/

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