std::atomic_...<std::shared_ptr>
定義於標頭檔案 <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 |
(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 |
(5) | (C++11 起) (C++20 中已棄用) (C++26 中移除) |
template< class T > std::shared_ptr<T> atomic_exchange |
(6) | (C++11 起) (C++20 中已棄用) (C++26 中移除) |
template< class T > std::shared_ptr<T> atomic_exchange_explicit |
(7) | (C++11 起) (C++20 中已棄用) (C++26 中移除) |
template< class T > bool atomic_compare_exchange_weak |
(8) | (C++11 起) (C++20 中已棄用) (C++26 中移除) |
template< class T > bool atomic_compare_exchange_strong |
(9) | (C++11 起) (C++20 中已棄用) (C++26 中移除) |
template< class T > bool atomic_compare_exchange_strong_explicit |
(10) | (C++11 起) (C++20 中已棄用) (C++26 中移除) |
template< class T > bool atomic_compare_exchange_weak_explicit |
(11) | (C++11 起) (C++20 中已棄用) (C++26 中移除) |
如果多個執行執行緒在沒有同步的情況下訪問同一個 std::shared_ptr 物件,並且其中任何訪問使用了 shared_ptr
的非 const 成員函式,那麼將會發生資料競爭,除非所有此類訪問都透過這些函式執行,這些函式是相應原子訪問函式(std::atomic_load、std::atomic_store 等)的過載。
請注意,shared_ptr
的控制塊是執行緒安全的:可以使用可變操作(例如 operator= 或 reset
)同時由多個執行緒訪問不同的 std::shared_ptr 物件,即使這些例項是副本,並且內部共享相同的控制塊。
(p, expected, desired, std::memory_order_seq_cst,
std::memory_order_seq_cst)。
(p, expected, desired, std::memory_order_seq_cst,
std::memory_order_seq_cst)。
- 如果它們等價(儲存相同的指標值,並且要麼共享同一個物件的所有權,要麼都為空),則使用 success 指定的記憶體順序約束將 desired 賦值給 *p 並返回 true。
- 如果它們不等價,則使用 failure 指定的記憶體順序約束將 *p 賦值給 *expected 並返回 false。
atomic_compare_exchange_weak_explicit
可能會虛假失敗。如果 p 是空指標,則所有這些函式的行為都未定義。
目錄 |
[編輯] 引數
p, expected | - | 指向 std::shared_ptr 的指標 |
r, desired | - | 一個 std::shared_ptr |
mo, success, failure | - | 型別為 std::memory_order 的記憶體序選擇器 |
[編輯] 異常
這些函式不丟擲異常。
[編輯] 返回值
[編輯] 注意
這些函式通常使用互斥量實現,互斥量儲存在全域性雜湊表中,其中指標值用作鍵。
併發 TS 提供了原子智慧指標類 atomic_shared_ptr
和 atomic_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 從未等價 |
如果它們儲存相同的指標值,則等價 |
[編輯] 另請參閱
(C++11) |
檢查原子型別的操作是否是無鎖的 (函式模板) |
(C++11)(C++11) |
原子地將原子物件的值替換為非原子引數 (函式模板) |
(C++11)(C++11) |
原子地獲取原子物件中儲存的值 (函式模板) |
(C++11)(C++11) |
原子地將原子物件的值替換為非原子引數,並返回原子的舊值 (函式模板) |
原子地將原子物件的值與非原子引數進行比較,如果相等則執行原子交換,否則執行原子載入 (函式模板) |