atomic<T*> 总是无锁的吗?

Is atomic<T*> always lock free?

在我的 MAC OS 上,atomic<T*> 是无锁的。

#include <iostream>
#include <atomic>

int main() {
    std::cout << std::atomic<void*>().is_lock_free() << std::endl;
    return 0;
}

output: 1

我想知道 atomic<T*> 是否总是无锁?

有参考介绍吗?

The standard allows implementing any atomic type (with exception of std::atomic_flag) to be implemented with locks. 即使平台允许某些类型的无锁原子,标准库开发人员也可能没有实现。

如果在使用锁时需要不同的实现,可以在编译时使用 ATOMIC_POINTER_LOCK_FREE 宏进行检查。

不,假设任何特定平台的 std::atomic 实现总是无锁的是不安全的。

该标准指定了一些标记宏,包括 ATOMIC_POINTER_LOCK_FREE,这表明对于相关平台,指针从不、有时或总是锁定。

您还可以从 std::atomic<T *>::is_always_lock_free 获得针对您的特定 T 的答案。1

注1:给定指针类型must be consistent,所以实例方法std::atomic<T *>::is_lock_free()是多余的。