命名空間
變體
動作

std::atomic_ref

出自 cppreference.com
< cpp‎ | atomic
 
 
並行支援函式庫
執行緒
(C++11)
(C++20)
this_thread 命名空間
(C++11)
(C++11)
(C++11)
協作式取消
互斥 (Mutual exclusion)
(C++11)
通用鎖管理
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
條件變數
(C++11)
旗標 (Semaphores)
閂鎖 (Latches) 與屏障 (Barriers)
(C++20)
(C++20)
期約 (Futures)
(C++11)
(C++11)
(C++11)
(C++11)
安全回收
(C++26)
風險指標 (Hazard Pointers)
原子型別
(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 物件仍有可能修改所參照的值。

若滿足以下任何條件,則該程式為非法(ill-formed):

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

目錄

[編輯] 嵌套類型

類型 定義
value_type std::remove_cv_t<T>
difference_type
  • value_type(若 T 為算術類型,且非 cv bool)。
  • 否則為 std::ptrdiff_t(若 T 為物件指標類型)。
  • 否則未定義。

[編輯] 資料成員

成員 描述
T* ptr 指向所參照物件的指標
(僅用於闡述的成員物件*)
指示該型別是否總為無鎖
(公開靜態成員常數) [編輯]
指示被 atomic_ref 參照的物件所需的對齊方式
(公開靜態成員常數) [編輯]

[編輯] 成員函式

建構一個 atomic_ref 物件
(公開成員函式) [編輯]
將值儲存到由 atomic_ref 物件參照的物件中
(公開成員函式) [編輯]
檢查 atomic_ref 物件是否為無鎖(lock-free)
(公開成員函式) [編輯]
以非原子參數原子地替換所參照物件的值
(公開成員函式) [編輯]
原子地取得所參照物件的值
(公開成員函式) [編輯]
從所參照物件載入一個值
(公開成員函式) [編輯]
原子地替換所參照物件的值,並取得先前持有的值
(公開成員函式) [編輯]
將所參照物件的值與非原子參數進行原子比較,若相等則執行原子交換,否則執行原子載入
(公開成員函式) [編輯]
阻塞執行緒直到收到通知且原子值發生變化
(公開成員函式) [編輯]
通知至少一個在該原子物件上等待的執行緒
(公開成員函式) [編輯]
通知所有在該原子物件上阻塞等待的執行緒
(公開成員函式) [編輯]
(C++26)
返回物件的位址
(公開成員函式) [編輯]
僅當 T 為算術類型(非 cv bool)或物件指標類型時提供
原子地將參數加到所參照物件儲存的值上,並取得先前持有的值
(公開成員函式) [編輯]
原子地從所參照物件儲存的值中減去參數,並取得先前持有的值
(公開成員函式) [編輯]
原子地對所參照的值進行加法或減法運算
(公開成員函式) [編輯]
僅當 T 為整數類型(非 cv bool)或物件指標類型時提供
(C++26)
原子地在參數與所參照物件的值之間執行 std::max,並取得先前持有的值
(公開成員函式) [編輯]
(C++26)
原子地在參數與所參照物件的值之間執行 std::min,並取得先前持有的值
(公開成員函式) [編輯]
原子地將所參照物件遞增或遞減 1
(公開成員函式) [編輯]
僅當 T 為整數類型(非 cv bool)時提供
原子地在參數與所參照物件的值之間執行位元 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 /* 見下方 */

struct atomic_ref</*pointer-type*/>;
(3) (自 C++20 起)
1) /*integral-type*/ 表示可能帶有 cv 限定符的整數類型,非 cv bool
2) /*floating-point-type*/ 表示可能帶有 cv 限定符的浮點類型。
3) 部分特化是為 /*pointer-type*/ 類型提供的,這些類型是可能帶有 cv 限定符的物件指標類型。

[編輯] 註解

實作可能合併上述指定的特化。例如,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++ 標準。

DR 應用於 出版時的行為 正確的行為
LWG 3508
(P3323R1)
C++20 atomic_ref<T> 具有無法實作的操作
Tconst 類型或非物件指標類型
這些操作要麼被受限
要麼對不適當的 T 不提供

[編輯] 參見

(C++11)
atomic 類別範本及其針對 bool、整數、 浮點數、(自 C++20 起)及指標型別的特化
(類別範本) [編輯]
English Deutsch 日本語 中文(简体) 中文(繁體)