c++ 在macOS上,`is_always_lock_free`给出`true`,但`is_lock_free()`给出`false`,为什么?

yhqotfr8  于 11个月前  发布在  Mac
关注(0)|答案(1)|浏览(107)

我正在尝试使用C++ atomic的std::atomic<T>::is_always_lock_freestd::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 = trueis_lock_free = false?如果它总是可以无锁,为什么b不是无锁的?

xvw2m8pv

xvw2m8pv1#

这是标准库**libc++**中的一个bug(在libstdc++中不存在)。实际上,它调用了内置:
atomic_always_lock_freesizeof(__cxx_atomic_impl<A>),即16
而它调用
atomic_is_lock_freesizeof(A),即12
从而产生不一致的结果。

相关问题