在 macOS 上,“is_always_lock_free”给出“true”,但“is_lock_free()”给出“false”,为什么?

Guo*_*uai 29 c++ macos clang lock-free stdatomic

我正在尝试 C++ 原子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;
}
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 = trueis_lock_free = false?如果可以一直无锁,为什么b不无锁呢?