Guo*_*uai 29 c++ macos clang lock-free stdatomic
我正在尝试 C++ 原子std::atomic<T>::is_always_lock_free和std::atomic<T>::is_lock_free.
我写了一个简单的结构体A,想知道 的原子版本是否A是无锁的:
#include <iostream>
#include <atomic>
using namespace std;
struct A {
int x;
int y;
int z;
};
int main() {
atomic<A> b;
cout << boolalpha;
cout << "b.is_always_lock_free = " << b.is_always_lock_free << endl;
cout << "b.is_lock_free = " << b.is_lock_free() << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在x86-64 Linux上,我用g++ 9.4.0和C++17编译它,输出正常:
b.is_always_lock_free = false
b.is_lock_free = false
Run Code Online (Sandbox Code Playgroud)
然而,我也在我的Mac(ARM64 )上用clang++ 16.0.0编译它,输出很奇怪:
b.is_always_lock_free = true
b.is_lock_free = false
Run Code Online (Sandbox Code Playgroud)
为什么is_always_lock_free = true和is_lock_free = false?如果可以一直无锁,为什么b不无锁呢?
这是标准库libc++中的一个错误(libstdc++ 中不存在)。实际上它调用了内置函数:
atomic_always_lock_free其中sizeof(__cxx_atomic_impl<A>)是16,
而它调用
atomic_is_lock_free其中sizeof(A)是12,
从而产生不一致的结果。
| 归档时间: |
|
| 查看次数: |
664 次 |
| 最近记录: |