- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
atomic_flag
是如何实现的?我觉得在 x86-64 上它无论如何都相当于atomic_bool,但这只是一个猜测。 x86-64 实现可能与arm 或x86 有所不同吗?
最佳答案
是的,在普通 CPU 上 atomic<bool>
和atomic<int>
也是无锁的,它很像 atomic<bool>
,使用相同的指令。 (x86 和 x86-64 具有相同的可用原子操作集。)
您可能认为它总是使用 x86 lock bts
或lock btr
设置/重置(清除)单个位,但执行其他操作可能会更有效(特别是对于返回 bool 而不是在其上分支的函数)。该对象是一个完整的字节,因此您可以只存储或交换整个字节。 (如果 ABI 保证该值始终为 0
或 1
,则在将结果返回为 bool
之前不必对其进行 bool 化)
GCC 和 clang 编译 test_and_set
到字节交换,并清除到字节存储 0
. 我们得到了(几乎)相同的 atomic_flag
的汇编。 test_and_set
如f.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
在内存中始终存储为 0
或1
字节。
对于 ARM,我们有 ldrexb
/strexb
交换重试循环,或者只是 strb
+ dmb ish
对于纯粹的商店。或者AArch64可以使用stlrb wzr, [x0]
对于 clear
或分配 false 来执行顺序释放存储(零寄存器),而不需要屏障。
关于c++ - atomic_flag是如何实现的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59601453/
我有一个 struct,我们称它为 struct foo,我想向其添加一个 atomic_flag 变量。到目前为止,我一直在 callocing 结构,因为它主要需要进行零初始化。我应该如何初始化
我正在使用 C++ std::atomic_flag作为一个原子 bool 标志。将标志设置为真或假不是问题,但是如何在不将其设置为某个值的情况下查询标志的当前状态?我知道有方法'atomic_fla
我在 cplusplus.com 尝试了使用 atomic_flag 的基本示例. Valgrind 的 Helgrind 工具报告 164 errors from 28 contexts (supp
以这种方式初始化 std::atomic_flag 真的很有必要: std::atomic_flag flag = ATOMIC_FLAG_INIT; 在我看来它应该有相同的结果: std::atom
我正在尝试熟悉 c++11 的新内存排序概念,并且相信我实际上已经很好地掌握了它们,直到我偶然发现了自旋锁的这个实现: #include namespace JayZ { namespace
我正在尝试熟悉 c++11 的新内存排序概念,并且相信我实际上已经很好地掌握了它们,直到我偶然发现了自旋锁的这个实现: #include namespace JayZ { namespace
使用 std::atomic_flag 时, 必须小心始终使用 ATOMIC_FLAG_INIT 显式初始化它,这是容易出错的。然而,有一个默认构造函数...那么,在让标志处于未指定状态的默认构造函数
在类构造函数中初始化 std::atomic_flag 的安全方法是什么? This question似乎在问我问的同一个问题 - 除了这里提问者提示编译器问题。 我的问题与 C++ 标准本身有关。根
摘自 C++ 并发实践: difference between std::atomic and std::atomic_flag is that std::atomic may not be lock
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 3 年前。 Improve this qu
比较 std::atomic_flag 到std::atomic_bool (又名 std::atomic ),在我看来 std::atomic_flag只是有一个更简单的界面。它仅提供测试+设置和清
我有一个简单的 bool 值,需要以线程安全的方式进行测试和设置。如果一个线程已经在工作,我希望第二个线程退出。如果我明白std::atomic_flag正确,这应该可以正常工作。但是,我不确定我是否
我正在尝试使用 atomic_flag 实现自旋锁。我知道使用 C++11 我必须初始化 atomic_flag 变量,但我无法编译它。我的代码如下所示: class SpinLock { publ
抱歉冗长 - 我已尽力将我的代码示例压缩为一个功能最少的类和 main() 方法。 我正在尝试使用 atomic_flag 通知我的工作线程中的 _rx() 在调用 stop() 时退出。 我认为问题
当调用notify_one()时,是否有关于在atomic_flag上调用wait()的线程被唤醒的顺序的公平性信息。它们是否按照进入 wait() 的确切顺序被唤醒,可以说是 FIFO 吗? 原子标
自 std::lock_guard不适用于 std::atomic_flag我已经实现了我自己的版本: class atomic_guard { public: inline atomic_g
使用 MS Visual C++2012 一个类有一个std::atomic_flag类型的成员 class A { public: ... std::atomic_flag
std::atomic_flag 有 2 个具有这些默认 std::memory_order 的函数: void clear(std::memory_order order = std::memory
我想知道使用 Windows 的 interlockedXXX 函数和使用 std::atomic_flag 访问 bool 值之间有什么区别。 据我所知,它们都是无锁的,您无法直接设置或读取 ato
我实现了一个小的多线程应用程序,它执行以下操作: 主线程 A main thread starts a timer using setitimer and starts up to 8 threads
我是一名优秀的程序员,十分优秀!