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()
是多余的。
在我的 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()
是多余的。