在我的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*>
是否总是无锁吗?
有介绍它的参考吗?
答案 0 :(得分:8)
The standard allows implementing any atomic type (with exception of std::atomic_flag) to be implemented with locks.即使平台允许某种类型的无锁原子,标准库开发人员也可能未实现。
如果在使用锁时需要实现其他功能,则可以在编译时使用ATOMIC_POINTER_LOCK_FREE
宏进行检查。
答案 1 :(得分:2)
否,不能肯定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()
是多余的。