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;
}
在x86-64 Linux上,我用g++ 9.4.0和C++17编译,输出正常:
b.is_always_lock_free = false
b.is_lock_free = false
但是,我也在我的Mac(ARM64)上用clang++ 16.0.0编译它,输出很奇怪:
b.is_always_lock_free = true
b.is_lock_free = false
为什么
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
,
从而产生不一致的结果。 由于所有原子操作都是在实现类型上执行的,我想库开发人员的修复方法是将其更改为使用存储的实现类型的大小调用atomic_is_lock_free,就像在 libstdc++ 中所做的那样。