std::atomic<std::shared_ptr>
定義於標頭檔案 <memory> |
||
template< class T > struct std::atomic<std::shared_ptr<T>>; |
(C++20 起) | |
std::atomic 對 std::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 函式,沒有額外的成員函式。
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) | |
void operator=( const atomic& ) = delete; |
(1) | |
void operator=( std::shared_ptr<T> desired ) noexcept; |
(2) | |
void operator=( std::nullptr_t ) noexcept; |
(3) | |
bool is_lock_free() const noexcept; |
||
如果對此型別所有物件的原子操作都是無鎖的,則返回 true,否則返回 false。
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 進行排序。如果 order 是 std::memory_order_consume、std::memory_order_acquire 或 std::memory_order_acq_rel,則行為未定義。
std::shared_ptr<T> load( std::memory_order order = std::memory_order_seq_cst ) const noexcept; |
||
原子性地返回底層共享指標的副本。記憶體按 order 進行排序。如果 order 是 std::memory_order_release 或 std::memory_order_acq_rel,則行為未定義。
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 進行排序。這是一個原子讀-改-寫操作。
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) | |
use_count
的此更新是此原子操作的一部分,儘管寫入本身(以及任何後續的解分配/銷燬)不需要是。fail_order
與 order 相同,除了 std::memory_order_acq_rel 被 std::memory_order_acquire 替換,std::memory_order_release 被 std::memory_order_relaxed 替換。fail_order
與 order 相同,除了 std::memory_order_acq_rel 被 std::memory_order_acquire 替換,std::memory_order_release 被 std::memory_order_relaxed 替換。 void wait( std::shared_ptr<T> old, std::memory_order order = std::memory_order_seq_cst ) const noexcept; |
||
執行原子等待操作。
將 load(order) 與 old 進行比較,如果它們相等,則阻塞直到 *this 被 notify_one()
或 notify_all()
通知。此過程重複,直到 load(order) 發生變化。即使底層實現虛假解除阻塞,此函式也保證僅在值發生變化時返回。
記憶體按 order 進行排序。如果 order 是 std::memory_order_release 或 std::memory_order_acq_rel,則行為未定義。
注意:如果兩個 shared_ptr
儲存相同的指標並且共享所有權,或者都為空,則它們是等效的。
void notify_one() noexcept; |
||
執行原子通知操作。
如果存在被原子等待操作(即 wait()
)阻塞在 *this 上的執行緒,則至少解除阻塞一個這樣的執行緒;否則不執行任何操作。
void notify_all() noexcept; |
||
執行原子通知操作。
解除阻塞所有被原子等待操作(即 wait()
)阻塞在 *this 上的執行緒(如果存在);否則不執行任何操作。
[編輯] 成員常量
此特化也提供了唯一的標準 std::atomic 成員常量 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 起) 和指標型別的特化 (類模板) |