名稱空間
變體
操作

std::atomic_...<std::shared_ptr>

來自 cppreference.com
 
 
記憶體管理庫
(僅作說明*)
未初始化記憶體演算法
(C++17)
(C++17)
(C++17)
受約束的未初始化
記憶體演算法
C 庫

分配器
記憶體資源
垃圾回收支援
(C++11)(直到 C++23)
(C++11)(直到 C++23)
(C++11)(直到 C++23)
(C++11)(直到 C++23)
(C++11)(直到 C++23)
(C++11)(直到 C++23)
未初始化儲存
(直到 C++20*)
(直到 C++20*)
顯式生命週期管理
 
 
定義於標頭檔案 <memory>
template< class T >
bool atomic_is_lock_free( const std::shared_ptr<T>* p );
(1) (C++11 起)
(C++20 中已棄用)
(C++26 中移除)
template< class T >
std::shared_ptr<T> atomic_load( const std::shared_ptr<T>* p );
(2) (C++11 起)
(C++20 中已棄用)
(C++26 中移除)
template< class T >

std::shared_ptr<T> atomic_load_explicit

    ( const std::shared_ptr<T>* p, std::memory_order mo );
(3) (C++11 起)
(C++20 中已棄用)
(C++26 中移除)
template< class T >
void atomic_store( std::shared_ptr<T>* p, std::shared_ptr<T> r );
(4) (C++11 起)
(C++20 中已棄用)
(C++26 中移除)
template< class T >

void atomic_store_explicit
    ( std::shared_ptr<T>* p, std::shared_ptr<T> r,

      std::memory_order mo );
(5) (C++11 起)
(C++20 中已棄用)
(C++26 中移除)
template< class T >

std::shared_ptr<T> atomic_exchange

    ( std::shared_ptr<T>* p, std::shared_ptr<T> r );
(6) (C++11 起)
(C++20 中已棄用)
(C++26 中移除)
template< class T >

std::shared_ptr<T> atomic_exchange_explicit
    ( std::shared_ptr<T>* p, std::shared_ptr<T> r,

      std::memory_order mo );
(7) (C++11 起)
(C++20 中已棄用)
(C++26 中移除)
template< class T >

bool atomic_compare_exchange_weak
    ( std::shared_ptr<T>* p, std::shared_ptr<T>* expected,

      std::shared_ptr<T> desired );
(8) (C++11 起)
(C++20 中已棄用)
(C++26 中移除)
template< class T >

bool atomic_compare_exchange_strong
    ( std::shared_ptr<T>* p, std::shared_ptr<T>* expected,

      std::shared_ptr<T> desired );
(9) (C++11 起)
(C++20 中已棄用)
(C++26 中移除)
template< class T >

bool atomic_compare_exchange_strong_explicit
    ( std::shared_ptr<T>* p, std::shared_ptr<T>* expected,
      std::shared_ptr<T> desired,

      std::memory_order success, std::memory_order failure );
(10) (C++11 起)
(C++20 中已棄用)
(C++26 中移除)
template< class T >

bool atomic_compare_exchange_weak_explicit
    ( std::shared_ptr<T>* p, std::shared_ptr<T>* expected,
      std::shared_ptr<T> desired,

      std::memory_order success, std::memory_order failure );
(11) (C++11 起)
(C++20 中已棄用)
(C++26 中移除)

如果多個執行執行緒在沒有同步的情況下訪問同一個 std::shared_ptr 物件,並且其中任何訪問使用了 shared_ptr 的非 const 成員函式,那麼將會發生資料競爭,除非所有此類訪問都透過這些函式執行,這些函式是相應原子訪問函式(std::atomic_loadstd::atomic_store 等)的過載。

請注意,shared_ptr 的控制塊是執行緒安全的:可以使用可變操作(例如 operator=reset)同時由多個執行緒訪問不同的 std::shared_ptr 物件,即使這些例項是副本,並且內部共享相同的控制塊。

1) 確定對 p 指向的共享指標的原子訪問是否是無鎖的。
2) 等價於 atomic_load_explicit(p, std::memory_order_seq_cst)
3) 返回 p 指向的共享指標。
與非專用化的 std::atomic_load_explicit 一樣,如果 mostd::memory_order_releasestd::memory_order_acq_rel,則行為未定義。
4) 等價於 atomic_store_explicit(p, r, std::memory_order_seq_cst)
5) 原子地將共享指標 r 儲存到 p 指向的共享指標中,如同透過 p->swap(r)
與非專用化的 std::atomic_store_explicit 一樣,如果 mostd::memory_order_acquirestd::memory_order_acq_rel,則行為未定義。
6) 等價於 atomic_exchange_explicit(p, r, std::memory_order_seq_cst)
7) 原子地將共享指標 r 儲存到 p 指向的共享指標中,並返回 p 以前指向的值,如同透過 p->swap(r),並返回交換後 r 的副本。
8) 等價於
atomic_compare_exchange_weak_explicit
    (p, expected, desired, std::memory_order_seq_cst,
                           std::memory_order_seq_cst)
9) 等價於
atomic_compare_exchange_strong_explicit
    (p, expected, desired, std::memory_order_seq_cst,
                           std::memory_order_seq_cst)
10,11) 比較 pexpected 指向的共享指標。
  • 如果它們等價(儲存相同的指標值,並且要麼共享同一個物件的所有權,要麼都為空),則使用 success 指定的記憶體順序約束將 desired 賦值給 *p 並返回 true
  • 如果它們不等價,則使用 failure 指定的記憶體順序約束將 *p 賦值給 *expected 並返回 false
atomic_compare_exchange_weak_explicit 可能會虛假失敗。
如果 expected 是空指標,或者 failurestd::memory_order_releasestd::memory_order_acq_rel,則行為未定義。

如果 p 是空指標,則所有這些函式的行為都未定義。

目錄

[編輯] 引數

p, expected - 指向 std::shared_ptr 的指標
r, desired - 一個 std::shared_ptr
mo, success, failure - 型別為 std::memory_order 的記憶體序選擇器

[編輯] 異常

這些函式不丟擲異常。

[編輯] 返回值

1) 如果原子訪問是使用無鎖指令實現的,則為 true
2,3) 指向的共享指標的副本。
4,5) (無)
6,7) 以前指向的共享指標的副本。
8-11) 如果共享指標等價且執行了交換,則為 true,否則為 false

[編輯] 注意

這些函式通常使用互斥量實現,互斥量儲存在全域性雜湊表中,其中指標值用作鍵。

併發 TS 提供了原子智慧指標類 atomic_shared_ptratomic_weak_ptr 作為這些函式使用的替代方案。

這些函式已被棄用,轉而使用 std::atomic 模板的特化:std::atomic<std::shared_ptr>std::atomic<std::weak_ptr>

(C++20 起)
(直到 C++26)

這些函式已被移除,轉而使用 std::atomic 模板的特化:std::atomic<std::shared_ptr>std::atomic<std::weak_ptr>

(C++26 起)

[編輯] 示例

[編輯] 缺陷報告

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

缺陷報告 應用於 釋出時的行為 正確的行為
LWG 2172 C++11 expected 可以是空指標 在這種情況下行為未定義
LWG 2980 C++11 空的 shared_ptr 從未等價 如果它們儲存相同的指標值,則等價

[編輯] 另請參閱

檢查原子型別的操作是否是無鎖的
(函式模板) [編輯]
原子地將原子物件的值替換為非原子引數
(函式模板) [編輯]
原子地獲取原子物件中儲存的值
(函式模板) [編輯]
原子地將原子物件的值替換為非原子引數,並返回原子的舊值
(函式模板) [編輯]
原子地將原子物件的值與非原子引數進行比較,如果相等則執行原子交換,否則執行原子載入
(函式模板) [編輯]