std::atomic<std::shared_ptr>
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, , std::atomic<std::shared_ptr> (, C++20, std::shared_ptr).
use_count . use_count , , use_count expected CAS. .
, shared_ptr : std::shared_ptr mutable , operator = reset , .
T .
value_type
|
std::shared_ptr<T>
|
-
std::atomic -.
<tbody> </tbody>
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) | |
shared_ptr<T> .<tbody> </tbody>
void operator=( const atomic& ) = delete; |
(1) | |
void operator=( std::shared_ptr<T> desired ) noexcept; |
(2) | |
void operator=( std::nullptr_t ) noexcept; |
(3) | |
store(desired)store(nullptr);.
<tbody> </tbody>
bool is_lock_free() const noexcept; |
||
true, , false.
<tbody> </tbody>
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.
<tbody> </tbody>
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.
<tbody> </tbody>
operator std::shared_ptr<T>() const noexcept; |
||
return load();
<tbody> </tbody>
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. --.
<tbody> </tbody>
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) | |
std::shared_ptr<T> T*, expected, , , expected , desired std::shared_ptr<T>, true success, std::shared_ptr<T> expected, false failure. , failure std::memory_order_release std::memory_order_acq_rel. -- *this, expected . *this, expected , . use_count expected , ( /) .return compare_exchange_strong(expected, desired, order, fail_order);, fail_order order, , std::memory_order_acq_rel std::memory_order_acquire, std::memory_order_release std::memory_order_relaxed.return compare_exchange_weak(expected, desired, order, fail_order); fail_order order, , std::memory_order_acq_rel std::memory_order_acquire, std::memory_order_release std::memory_order_relaxed.
<tbody> </tbody>
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 , , .
<tbody> </tbody>
void notify_one() noexcept; |
||
.
, (.. wait()) *this, ; .
<tbody> </tbody>
void notify_all() noexcept; |
||
.
, (.. wait()) *this, ; .
- std::atomic is_always_lock_free, .
<tbody> </tbody>
static constexpr bool is_always_lock_free = /*-*/; |
||
__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, ( ) |