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 物件仍有可能修改所參照的值。
若滿足以下任何條件,則該程式為非法(ill-formed):
- 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 物件是否為無鎖(lock-free)(公開成員函式) | |
| 以非原子參數原子地替換所參照物件的值 (公開成員函式) | |
| 原子地取得所參照物件的值 (公開成員函式) | |
| 從所參照物件載入一個值 (公開成員函式) | |
| 原子地替換所參照物件的值,並取得先前持有的值 (公開成員函式) | |
| 將所參照物件的值與非原子參數進行原子比較,若相等則執行原子交換,否則執行原子載入 (公開成員函式) | |
| 阻塞執行緒直到收到通知且原子值發生變化 (公開成員函式) | |
| 通知至少一個在該原子物件上等待的執行緒 (公開成員函式) | |
| 通知所有在該原子物件上阻塞等待的執行緒 (公開成員函式) | |
| (C++26) |
返回物件的位址 (公開成員函式) |
僅當
| |
| 原子地將參數加到所參照物件儲存的值上,並取得先前持有的值 (公開成員函式) | |
| 原子地從所參照物件儲存的值中減去參數,並取得先前持有的值 (公開成員函式) | |
| 原子地對所參照的值進行加法或減法運算 (公開成員函式) | |
僅當
| |
| (C++26) |
原子地在參數與所參照物件的值之間執行 std::max,並取得先前持有的值 (公開成員函式) |
| (C++26) |
原子地在參數與所參照物件的值之間執行 std::min,並取得先前持有的值 (公開成員函式) |
| 原子地將所參照物件遞增或遞減 1 (公開成員函式) | |
僅當
| |
| 原子地在參數與所參照物件的值之間執行位元 AND 運算,並取得先前持有的值 (公開成員函式) | |
| 原子地在參數與所參照物件的值之間執行位元 OR 運算,並取得先前持有的值 (公開成員函式) | |
| 原子地在參數與所參照物件的值之間執行位元 XOR 運算,並取得先前持有的值 (公開成員函式) | |
| 原子地對所參照的值執行位元 AND、OR、XOR 運算 (公開成員函式) | |
[編輯] 特化
標準規定 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++ 標準。
| DR | 應用於 | 出版時的行為 | 正確的行為 |
|---|---|---|---|
| LWG 3508 (P3323R1) |
C++20 | atomic_ref<T> 具有無法實作的操作 若 T 為 const 類型或非物件指標類型 |
這些操作要麼被受限 要麼對不適當的 T 不提供 |
[編輯] 參見
| (C++11) |
atomic 類別範本及其針對 bool、整數、 浮點數、(自 C++20 起)及指標型別的特化 (類別範本) |