名稱空間
變體
操作

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 >
struct std::atomic<std::shared_ptr<T>>;
(C++20 起)

std::atomicstd::shared_ptr<T> 的部分模板特化允許使用者原子性地操作 shared_ptr 物件。

如果多個執行執行緒在不同步的情況下訪問同一個 std::shared_ptr 物件,並且其中任何一次訪問使用了 shared_ptr 的非 const 成員函式,那麼將會發生資料競爭,除非所有此類訪問都是透過 std::atomic<std::shared_ptr> 的例項(或者,自 C++20 起已棄用,透過 獨立的函式 以原子方式訪問 std::shared_ptr)進行的。

關聯的 use_count 增量保證是原子操作的一部分。關聯的 use_count 減量在原子操作之後進行,但不需要成為其一部分,除了在失敗的 CAS 中覆蓋 expected 時的 use_count 更改。任何關聯的刪除和解分配都在原子更新步驟之後進行,並且不屬於原子操作的一部分。

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

型別 T 可以是不完整型別。

目錄

[編輯] 成員型別

成員型別 定義
value_type std::shared_ptr<T>

[編輯] 成員函式

此特化提供了所有非特化 std::atomic 函式,沒有額外的成員函式。

atomic<shared_ptr<T>>::atomic

constexpr atomic() noexcept = default;
(1)
constexpr atomic( std::nullptr_t ) noexcept : atomic() {}
(2)
atomic( std::shared_ptr<T> desired ) noexcept;
(3)
atomic( const atomic& ) = delete;
(4)
1,2) 將底層 shared_ptr<T> 初始化為 null 值。
3) 將底層 shared_ptr<T> 初始化為 desired 的副本。與任何 std::atomic 型別一樣,初始化不是原子操作。
4) 原子型別不可複製/移動構造。

atomic<shared_ptr<T>>::operator=

void operator=( const atomic& ) = delete;
(1)
void operator=( std::shared_ptr<T> desired ) noexcept;
(2)
void operator=( std::nullptr_t ) noexcept;
(3)
1) 原子型別不可複製/移動賦值。
2) 值賦值,等同於 store(desired)
3) 將原子共享指標重置為 null 指標值。等同於 store(nullptr);

atomic<shared_ptr<T>>::is_lock_free

bool is_lock_free() const noexcept;

如果對此型別所有物件的原子操作都是無鎖的,則返回 true,否則返回 false

atomic<shared_ptr<T>>::store

void store( std::shared_ptr<T> desired,
            std::memory_order order = std::memory_order_seq_cst ) noexcept;

原子性地將 *this 的值替換為 desired 的值,如同透過 p.swap(desired),其中 p 是底層 std::shared_ptr<T>。記憶體按 order 進行排序。如果 orderstd::memory_order_consumestd::memory_order_acquirestd::memory_order_acq_rel,則行為未定義。

atomic<shared_ptr<T>>::load

原子性地返回底層共享指標的副本。記憶體按 order 進行排序。如果 orderstd::memory_order_releasestd::memory_order_acq_rel,則行為未定義。

atomic<shared_ptr<T>>::operator std::shared_ptr<T>

operator std::shared_ptr<T>() const noexcept;

等同於 return load();

atomic<shared_ptr<T>>::exchange

std::shared_ptr<T> exchange( std::shared_ptr<T> desired,
                             std::memory_order order = std::memory_order_seq_cst ) noexcept;

原子性地將底層 std::shared_ptr<T> 替換為 desired,如同透過 p.swap(desired),其中 p 是底層 std::shared_ptr<T>,並返回 p 在交換前立即擁有的值的副本。記憶體按 order 進行排序。這是一個原子讀-改-寫操作。

atomic<shared_ptr<T>>::compare_exchange_weak, compare_exchange_strong

bool compare_exchange_strong( std::shared_ptr<T>& expected, std::shared_ptr<T> desired,
                              std::memory_order success, std::memory_order failure ) noexcept;
(1)
bool compare_exchange_weak( std::shared_ptr<T>& expected, std::shared_ptr<T> desired,
                            std::memory_order success, std::memory_order failure ) noexcept;
(2)
bool compare_exchange_strong( std::shared_ptr<T>& expected, std::shared_ptr<T> desired,
                              std::memory_order order = std::memory_order_seq_cst ) noexcept;
(3)
bool compare_exchange_weak( std::shared_ptr<T>& expected, std::shared_ptr<T> desired,
                            std::memory_order order = std::memory_order_seq_cst ) noexcept;
(4)
1) 如果底層 std::shared_ptr<T> 儲存與 expected 相同的 T* 並與其共享所有權,或者如果底層和 expected 都為空,則將 desired 賦值給底層 std::shared_ptr<T>,返回 true,並根據 success 排序記憶體;否則將底層 std::shared_ptr<T> 賦值給 expected,返回 false,並根據 failure 排序記憶體。如果 failurestd::memory_order_releasestd::memory_order_acq_rel,則行為未定義。成功時,該操作是對 *this 的原子讀-改-寫操作,並且在原子更新後不再訪問 expected。失敗時,該操作是對 *this 的原子載入操作,並且 expected 會更新為從原子物件讀取的現有值。對 expecteduse_count 的此更新是此原子操作的一部分,儘管寫入本身(以及任何後續的解分配/銷燬)不需要是。
2)(1),但可能虛假失敗。
3) 等同於:return compare_exchange_strong(expected, desired, order, fail_order);,其中 fail_orderorder 相同,除了 std::memory_order_acq_relstd::memory_order_acquire 替換,std::memory_order_releasestd::memory_order_relaxed 替換。
4) 等同於:return compare_exchange_weak(expected, desired, order, fail_order);,其中 fail_orderorder 相同,除了 std::memory_order_acq_relstd::memory_order_acquire 替換,std::memory_order_releasestd::memory_order_relaxed 替換。

atomic<shared_ptr<T>>::wait

void wait( std::shared_ptr<T> old,
           std::memory_order order = std::memory_order_seq_cst ) const noexcept;

執行原子等待操作。

load(order)old 進行比較,如果它們相等,則阻塞直到 *thisnotify_one()notify_all() 通知。此過程重複,直到 load(order) 發生變化。即使底層實現虛假解除阻塞,此函式也保證僅在值發生變化時返回。

記憶體按 order 進行排序。如果 orderstd::memory_order_releasestd::memory_order_acq_rel,則行為未定義。

注意:如果兩個 shared_ptr 儲存相同的指標並且共享所有權,或者都為空,則它們是等效的。

atomic<shared_ptr<T>>::notify_one

void notify_one() noexcept;

執行原子通知操作。

如果存在被原子等待操作(即 wait())阻塞在 *this 上的執行緒,則至少解除阻塞一個這樣的執行緒;否則不執行任何操作。

atomic<shared_ptr<T>>::notify_all

void notify_all() noexcept;

執行原子通知操作。

解除阻塞所有被原子等待操作(即 wait())阻塞在 *this 上的執行緒(如果存在);否則不執行任何操作。

[編輯] 成員常量

此特化也提供了唯一的標準 std::atomic 成員常量 is_always_lock_free

atomic<shared_ptr<T>>::is_always_lock_free

static constexpr bool is_always_lock_free = /*implementation-defined*/;

[編輯] 備註

特性測試 標準 特性
__cpp_lib_atomic_shared_ptr 201711L (C++20) std::atomic<std::shared_ptr>

[編輯] 示例

[編輯] 缺陷報告

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

缺陷報告 應用於 釋出時的行為 正確的行為
LWG 3661 C++20 atomic<shared_ptr<T>> 不能從 nullptr 常量初始化 已改為可常量初始化
LWG 3893 C++20 LWG3661 使得 atomic<shared_ptr<T>> 不能從 nullptr_t 賦值 賦值能力已恢復

[編輯] 參閱

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