std:: atomic_is_lock_free, ATOMIC_xxx_LOCK_FREE
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
定义于头文件
<atomic>
|
||
|
template
<
class
T
>
bool atomic_is_lock_free ( const volatile std:: atomic < T > * obj ) noexcept ; |
(1) | (C++11 起) |
|
template
<
class
T
>
bool atomic_is_lock_free ( const std:: atomic < T > * obj ) noexcept ; |
(2) | (C++11 起) |
|
#define ATOMIC_BOOL_LOCK_FREE /* unspecified */
#define ATOMIC_CHAR_LOCK_FREE /* unspecified */
|
(3) | (C++11 起) |
|
#define ATOMIC_CHAR8_T_LOCK_FREE /* unspecified */
|
(4) | (C++20 起) |
- 0 对应从无锁的内置原子类型,
- 1 对应 有时 无锁的内置原子类型,
- 2 对应始终无锁的内置原子类型。
目录 |
参数
| obj | - | 指向待检测原子对象的指针 |
返回值
若 * obj 是无锁原子对象则为 true ,否则为 false 。
注释
除 std::atomic_flag 之外的所有原子类型,都可能通过互斥锁或其他锁定操作实现,而非使用无锁的原子CPU指令。原子类型也允许 有时 是无锁的:例如,如果只有部分子架构支持特定类型的无锁原子访问(如x86-64架构上的 CMPXCHG16B 指令),原子操作是否无锁可能要到运行时才能确定。
C++标准建议(但不强制要求)无锁原子操作同时也是地址无关的,即适用于使用共享内存的进程间通信。
示例
#include <atomic> #include <iostream> #include <utility> struct A { int a[4]; }; struct B { int x, y; }; int main() { std::atomic<A> a; std::atomic<B> b; std::cout << std::boolalpha << "std::atomic<A> is lock free? " << std::atomic_is_lock_free(&a) << '\n' << "std::atomic<B> is lock free? " << std::atomic_is_lock_free(&b) << '\n'; }
可能的输出:
std::atomic<A> is lock free? false std::atomic<B> is lock free? true
缺陷报告
下列行为变更缺陷报告被追溯应用于先前发布的 C++ 标准。
| 缺陷报告 | 适用标准 | 发布时行为 | 正确行为 |
|---|---|---|---|
| LWG 3249 | C++11 |
atomic_is_lock_free
通过指针进行规范,
存在歧义且可能接受无效指针值 |
通过原子对象
进行规范 |
参见
|
检查原子对象是否无锁
(
std::atomic<T>
的公开成员函数)
|
|
|
(C++11)
|
无锁布尔原子类型
(类) |
|
[static]
(C++17)
|
指示该类型始终为无锁类型
(
std::atomic<T>
的公开静态成员常量)
|
|
(C++20 中已弃用)
(C++26 中移除)
|
为
std::shared_ptr
特化原子操作
(函数模板) |
|
C 文档
关于
atomic_is_lock_free
|
|
|
C 文档
关于
ATOMIC_*_LOCK_FREE
|
|