名稱空間
變體
操作

std::atomic_ref

來自 cppreference.com
< cpp‎ | atomic
 
 
併發支援庫
執行緒
(C++11)
(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)
atomic_ref
(C++20)
原子型別的初始化
(C++11)(C++20 中已棄用)
(C++11)(C++20 中已棄用)
記憶體排序
(C++11)(C++26 中已棄用)
原子操作的自由函式
原子標誌的自由函式
 
 
定義於標頭檔案 <atomic>
template< class T >
struct atomic_ref;
(C++20 起)

std::atomic_ref 類模板對其引用的物件應用原子操作。

std::atomic_ref 物件的生命週期內,其引用的物件被視為原子物件。如果一個執行緒寫入一個原子物件,而另一個執行緒從它讀取,則行為是明確定義的(有關資料競爭的詳細資訊,請參見記憶體模型)。此外,對原子物件的訪問可以建立執行緒間同步並按std::memory_order指定對非原子記憶體訪問進行排序。

物件的生命週期必須超過所有引用該物件的 std::atomic_ref 的生命週期。當任何引用物件的 std::atomic_ref 例項存在時,必須透過這些 std::atomic_ref 例項獨佔地訪問該物件。被 std::atomic_ref 物件引用的物件的任何子物件都不得同時被任何其他 std::atomic_ref 物件引用。

透過 std::atomic_ref 對物件應用的原子操作,對於透過引用同一物件的任何其他 std::atomic_ref 應用的原子操作而言是原子的。

與核心語言中的引用一樣,std::atomic_ref 的 constness 是淺的——可以透過 const std::atomic_ref 物件修改引用的值。

如果滿足以下任何條件,程式將格式錯誤:

std::atomic_ref可複製構造的(CopyConstructible)

目錄

[編輯] 巢狀型別

型別 定義
value_type std::remove_cv_t<T>
difference_type
  • value_type,如果 T 是除 cv bool 之外的算術型別。
  • 否則,如果 T 是物件指標型別,則為 std::ptrdiff_t
  • 否則,未定義。

[編輯] 資料成員

成員 描述
T* ptr 指向被引用物件的指標
(僅用於闡釋的成員物件*)
指示該型別始終是無鎖的
(公共靜態成員常量) [編輯]
指示 atomic_ref 引用的物件所需的對齊方式
(公共靜態成員常量) [編輯]

[編輯] 成員函式

構造一個 atomic_ref 物件
(公共成員函式) [編輯]
將一個值儲存到 atomic_ref 物件引用的物件中
(公共成員函式) [編輯]
檢查 atomic_ref 物件是否是無鎖的
(公共成員函式) [編輯]
原子地用非原子引數替換被引用物件的值
(公共成員函式) [編輯]
原子地獲取被引用物件的值
(公共成員函式) [編輯]
從被引用物件載入值
(公共成員函式) [編輯]
原子地替換被引用物件的值並獲取先前持有的值
(公共成員函式) [編輯]
原子地將被引用物件的值與非原子引數進行比較,如果相等則執行原子交換,否則執行原子載入
(公共成員函式) [編輯]
阻塞執行緒直到被通知且原子值改變
(公共成員函式) [編輯]
通知至少一個等待原子物件的執行緒
(公共成員函式) [編輯]
通知所有被原子物件阻塞的執行緒
(公共成員函式) [編輯]
(C++26)
返回物件的地址
(公共成員函式) [編輯]
僅當 T 是除 cv bool 之外的算術型別或物件指標型別時提供
原子地將引數新增到被引用物件中儲存的值,並獲取先前持有的值
(公共成員函式) [編輯]
原子地從被引用物件中儲存的值中減去引數,並獲取先前持有的值
(公共成員函式) [編輯]
原子地對引用值進行加法或減法
(公共成員函式) [編輯]
僅當 T 是除 cv bool 之外的整數型別或物件指標型別時提供
(C++26)
原子地在引數和被引用物件的值之間執行 std::max,並獲取先前持有的值
(公共成員函式) [編輯]
(C++26)
原子地在引數和被引用物件的值之間執行 std::min,並獲取先前持有的值
(公共成員函式) [編輯]
原子地將引用物件遞增或遞減一
(公共成員函式) [編輯]
僅當 T 是除 cv bool 之外的整數型別時提供
原子地在引數和被引用物件的值之間執行按位與,並獲取先前持有的值
(公共成員函式) [編輯]
原子地在引數和被引用物件的值之間執行按位或,並獲取先前持有的值
(公共成員函式) [編輯]
原子地在引數和被引用物件的值之間執行按位異或,並獲取先前持有的值
(公共成員函式) [編輯]
原子地對引用值執行按位與、或、異或
(公共成員函式) [編輯]

[編輯] 特化

標準規定 std::atomic_ref 具有以下特化:

template<>
struct atomic_ref</*integral-type*/>;
(1) (C++20 起)
template<>
struct atomic_ref</*floating-point-type*/>;
(2) (C++20 起)
template< class /*pointer-type*/ >

    requires /* 見下文 */

struct atomic_ref</*pointer-type*/>;
(3) (C++20 起)
1) /*integral-type*/ 表示一個可能是 cv 限定的整數型別,但不是 cv bool
2) /*floating-point-type*/ 表示一個可能是 cv 限定的浮點型別。
3) 部分特化適用於可能是 cv 限定的物件指標型別 /*pointer-type*/

[編輯] 注意

實現可能會合並指定的特化。例如,MSVC STL 將所有特化合併到主模板中。

Tcv void 或函式型別時,std::atomic_ref<T*>(即 std::atomic_ref<void*>std::atomic_ref<int(*)()> 等)沒有 difference_type 或任何需要指標算術或關係比較(C++26 起)的操作。

特性測試 標準 特性
__cpp_lib_atomic_ref 201806L (C++20) std::atomic_ref
__cpp_lib_constexpr_atomic 202411L (C++26) constexpr std::atomicstd::atomic_ref

[編輯] 缺陷報告

下列更改行為的缺陷報告追溯地應用於以前出版的 C++ 標準。

缺陷報告 應用於 釋出時的行為 正確的行為
LWG 3508
(P3323R1)
C++20 atomic_ref<T> 具有無法實現的操作
如果 Tconst 型別或非物件指標型別
這些操作要麼受到約束
要麼不為不合適的 T 提供

[編輯] 另請參閱

(C++11)
atomic 類模板和針對 bool、整型、浮點型(C++20 起) 和指標型別的特化
(類模板) [編輯]