atomic <t *>总是不锁定吗?

时间:2018-08-13 12:23:05

标签: c++ c++11 std stdatomic

在我的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*>是否总是无锁吗?

有介绍它的参考吗?

2 个答案:

答案 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()是多余的。