名稱空間
變體
操作

std::atomic_is_lock_free, ATOMIC_xxx_LOCK_FREE

來自 cppreference.com
< cpp‎ | atomic
 
 
併發支援庫
執行緒
(C++20)
this_thread 名稱空間
(C++11)
(C++11)
(C++11)
協同取消
互斥
(C++11)
通用鎖管理
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
條件變數
(C++11)
訊號量
門閂和屏障
(C++20)
(C++20)
期值
(C++11)
(C++11)
(C++11)
(C++11)
安全回收
(C++26)
危險指標
原子型別
(C++11)
(C++20)
原子型別的初始化
(C++11)(C++20 中已棄用)
(C++11)(C++20 中已棄用)
記憶體排序
(C++11)(C++26 中已棄用)
原子操作的自由函式
atomic_is_lock_free
(C++11)
原子標誌的自由函式
 
定義於標頭檔案 <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     /* 未指定 */
#define ATOMIC_CHAR16_T_LOCK_FREE /* 未指定 */
#define ATOMIC_CHAR32_T_LOCK_FREE /* 未指定 */
#define ATOMIC_WCHAR_T_LOCK_FREE  /* 未指定 */
#define ATOMIC_SHORT_LOCK_FREE    /* 未指定 */
#define ATOMIC_INT_LOCK_FREE      /* 未指定 */
#define ATOMIC_LONG_LOCK_FREE     /* 未指定 */
#define ATOMIC_LLONG_LOCK_FREE    /* 未指定 */

#define ATOMIC_POINTER_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> 的公共成員函式) [編輯]
無鎖布林原子型別
(類) [編輯]
[static] (C++17)
指示該型別始終是無鎖的
(std::atomic<T> 的公共靜態成員常量) [編輯]
(C++20 中已棄用)(C++26 中移除)
std::shared_ptr 特化原子操作
(函式模板)
C 文件 for atomic_is_lock_free
C 文件 for ATOMIC_*_LOCK_FREE