std::atomic_ref
定義於標頭檔案 <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::is_trivially_copyable_v<T> 為 false。
-
is_always_lock_free
為 false 且 std::is_volatile_v<T> 為 true。
std::atomic_ref
是 可複製構造的(CopyConstructible)。
目錄 |
[編輯] 巢狀型別
型別 | 定義 |
value_type
|
std::remove_cv_t<T> |
difference_type
|
|
[編輯] 資料成員
成員 | 描述 |
T* ptr |
指向被引用物件的指標 (僅用於闡釋的成員物件*) |
指示該型別始終是無鎖的 (公共靜態成員常量) | |
指示 atomic_ref 引用的物件所需的對齊方式(公共靜態成員常量) |
[編輯] 成員函式
構造一個 atomic_ref 物件(公共成員函式) | |
將一個值儲存到 atomic_ref 物件引用的物件中(公共成員函式) | |
檢查 atomic_ref 物件是否是無鎖的(公共成員函式) | |
原子地用非原子引數替換被引用物件的值 (公共成員函式) | |
原子地獲取被引用物件的值 (公共成員函式) | |
從被引用物件載入值 (公共成員函式) | |
原子地替換被引用物件的值並獲取先前持有的值 (公共成員函式) | |
原子地將被引用物件的值與非原子引數進行比較,如果相等則執行原子交換,否則執行原子載入 (公共成員函式) | |
阻塞執行緒直到被通知且原子值改變 (公共成員函式) | |
通知至少一個等待原子物件的執行緒 (公共成員函式) | |
通知所有被原子物件阻塞的執行緒 (公共成員函式) | |
(C++26) |
返回物件的地址 (公共成員函式) |
僅當
| |
原子地將引數新增到被引用物件中儲存的值,並獲取先前持有的值 (公共成員函式) | |
原子地從被引用物件中儲存的值中減去引數,並獲取先前持有的值 (公共成員函式) | |
原子地對引用值進行加法或減法 (公共成員函式) | |
僅當
| |
(C++26) |
原子地在引數和被引用物件的值之間執行 std::max,並獲取先前持有的值 (公共成員函式) |
(C++26) |
原子地在引數和被引用物件的值之間執行 std::min,並獲取先前持有的值 (公共成員函式) |
原子地將引用物件遞增或遞減一 (公共成員函式) | |
僅當
| |
原子地在引數和被引用物件的值之間執行按位與,並獲取先前持有的值 (公共成員函式) | |
原子地在引數和被引用物件的值之間執行按位或,並獲取先前持有的值 (公共成員函式) | |
原子地在引數和被引用物件的值之間執行按位異或,並獲取先前持有的值 (公共成員函式) | |
原子地對引用值執行按位與、或、異或 (公共成員函式) |
[編輯] 特化
標準規定 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 /* 見下文 */ |
(3) | (C++20 起) |
[編輯] 注意
實現可能會合並指定的特化。例如,MSVC STL 將所有特化合併到主模板中。
當 T
是 cv 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::atomic 和 std::atomic_ref |
[編輯] 缺陷報告
下列更改行為的缺陷報告追溯地應用於以前出版的 C++ 標準。
缺陷報告 | 應用於 | 釋出時的行為 | 正確的行為 |
---|---|---|---|
LWG 3508 (P3323R1) |
C++20 | atomic_ref<T> 具有無法實現的操作 如果 T 是 const 型別或非物件指標型別 |
這些操作要麼受到約束 要麼不為不合適的 T 提供 |
[編輯] 另請參閱
(C++11) |
atomic 類模板和針對 bool、整型、浮點型(C++20 起) 和指標型別的特化 (類模板) |