我正在尝试使用C++ atomic的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-64Linux上,我用g++ 9.4.0和C++17编译,输出正常:
b.is_always_lock_free = false
b.is_lock_free = false
型
不过,我也用clang++ 16.0.0在我的Mac(ARM 64)上编译过,输出结果很奇怪:
b.is_always_lock_free = true
b.is_lock_free = false
型
为什么is_always_lock_free = true
和is_lock_free = false
?如果它总是可以无锁,为什么b
不是无锁的?
1条答案
按热度按时间xvw2m8pv1#
这是标准库**libc++**中的一个bug(在libstdc++中不存在)。实际上,它调用了内置:
atomic_always_lock_free
与sizeof(__cxx_atomic_impl<A>)
,即16
,而它调用
atomic_is_lock_free
和sizeof(A)
,即12
,从而产生不一致的结果。