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

问题描述 投票:0回答:1

我正在尝试 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;
}

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
不无锁呢?

c++ macos clang lock-free stdatomic
1个回答
0
投票

这是标准库 libc++ 中的一个错误(libstdc++ 中不存在)。实际上它调用了内置函数:

atomic_always_lock_free
sizeof(__cxx_atomic_impl<A>)
16
,

而它打电话

atomic_is_lock_free
sizeof(A)
12
,

从而产生不一致的结果。 由于所有原子操作都是在实现类型上执行的,我想库开发人员的修复方法是将其更改为使用存储的实现类型的大小调用atomic_is_lock_free,就像在 libstdc++ 中所做的那样。

© www.soinside.com 2019 - 2024. All rights reserved.