std::atomic_is_lock_free, ATOMIC_xxx_LOCK_FREE
來自 cppreference.com
定義於標頭檔案 <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 /* 未指定 */ #define ATOMIC_CHAR_LOCK_FREE /* 未指定 */ |
(3) | (C++11 起) |
#define ATOMIC_CHAR8_T_LOCK_FREE /* 未指定 */ |
(4) | (C++20 起) |
1,2) 確定由 obj 指向的原子物件是否以無鎖方式實現,如同呼叫 obj->is_lock_free()。在任何給定的程式執行中,對於相同型別的所有原子物件,無鎖查詢的結果是相同的。
3,4) 擴充套件為值為以下之一的整數常量表達式:
- 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[100]; }; 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 文件 for atomic_is_lock_free
| |
C 文件 for ATOMIC_*_LOCK_FREE
|