std::atomic_...<std::shared_ptr>
template< class T > bool atomic_is_lock_free( const std::shared_ptr<T>* p ); | (1) | (since C++11) |
---|---|---|
template< class T > std::shared_ptr<T> atomic_load( const std::shared_ptr<T>* p ); | (2) | (since C++11) |
template< class T > std::shared_ptr<T> atomic_load_explicit( const std::shared_ptr<T>* p, std::memory_order mo ); | (3) | (since C++11) |
template< class T > void atomic_store( std::shared_ptr<T>* p, std::shared_ptr<T> r ); | (4) | (since C++11) |
template< class T > void atomic_store_explicit( std::shared_ptr<T>* p, std::shared_ptr<T> r, std::memory_order mo); | (5) | (since C++11) |
template< class T > std::shared_ptr<T> atomic_exchange( std::shared_ptr<T>* p, std::shared_ptr<T> r); | (6) | (since C++11) |
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) | (since C++11) |
template< class T > bool atomic_compare_exchange_weak( std::shared_ptr<T>* p, std::shared_ptr<T>* expected, std::shared_ptr<T> desired); | (8) | (since C++11) |
template<class T> bool atomic_compare_exchange_strong( std::shared_ptr<T>* p, std::shared_ptr<T>* expected, std::shared_ptr<T> desired); | (9) | (since C++11) |
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) | (since C++11) |
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) | (since C++11) |
如果多个执行线程访问相同的std::shared_ptr
对象,并且这些访问中的任何一个都使用非Const成员函数。shared_ptr
然后将发生数据竞争,除非通过这些函数执行所有此类访问,这些函数是相应的原子访问函数%28的重载。std::atomic_load
,,,std::atomic_store
,等.%29.
注意,共享的控制块[医]PTR是线程安全的:不同std::shared_ptr
对象可以使用可变操作(如Operator=或Reset)由多个线程同时访问,即使这些实例是副本,并且在内部共享相同的控制块。
1%29确定是否原子访问指向的共享指针。p
是无锁的。
2%29相当于atomic_load_explicit(p,std::memory_order_seq_cst)
3%29返回指向的共享指针p
.和非专业人士一样std::atomic_load_explicit
,,,mo
不可能std::memory_order_release
或std::memory_order_acq_rel
4%29相当于atomic_store_explicit(p, r, memory_order_seq_cst)
5%29存储共享指针r
在指向p
原子地,有效地执行p->swap(r)
.和非专业人士一样std::atomic_store_explicit
,,,mo
不可能std::memory_order_acquire
或std::memory_order_acq_rel
...
6%29相当于atomic_exchange_explicit(p, r, memory_order_seq_cst)
7%29存储共享指针r
所指向的共享指针中p
并返回以前指向的值p
,原子化。有效执行p->swap(r)
并返回r
交换之后。
8%29相当于atomic_compare_exchange_weak_explicit(p, expected, desired,std::memory_order_seq_cst,std::memory_order_seq_cst)
9%29相当于atomic_compare_exchange_strong_explicit(p, expected, desired,std::memory_order_seq_cst,std::memory_order_seq_cst)
10%29比较所指向的共享指针p
和expected
如果它们相等于相同指针的28共享所有权,并且引用相同的指针%29,则分配desired
进*p
指定的内存排序约束。success
和回报true
.如果它们不相等,则分配*p
进*expected
指定的内存排序约束。failure
和回报false
...
11%29和10%29相同,但可能会伪造失败。
所有这些函数都在以下情况下调用未定义的行为:p
为空指针。
参数
p, expected | - | a pointer to a std::shared_ptr |
---|---|---|
r, desired | - | a std::shared_ptr |
mo, success, failure | - | memory ordering selectors of type std::memory_order |
例外
这些函数不会引发异常。
返回值
1%29true
如果原子访问是使用无锁指令实现的。
2,3%29指向共享指针的副本.
4,5%29%28无29
6,7%29以前指向共享指针的副本
8,9,10,11%29true
如果共享指针是等价的,并且执行了交换,false
否则。
注记
大并发TS提供原子智能指针类。atomic_shared_ptr
和atomic_weak_ptr
代替使用这些功能。
例
另见
atomic_is_lock_free (C++11) | checks if the atomic type's operations are lock-free (function template) |
---|---|
atomic_storeatomic_store_explicit (C++11)(C++11) | atomically replaces the value of the atomic object with a non-atomic argument (function template) |
atomic_loadatomic_load_explicit (C++11)(C++11) | atomically obtains the value stored in an atomic object (function template) |
atomic_exchangeatomic_exchange_explicit (C++11)(C++11) | atomically replaces the value of the atomic object with non-atomic argument and returns the old value of the atomic (function template) |
atomic_compare_exchange_weakatomic_compare_exchange_weak_explicitatomic_compare_exchange_strongatomic_compare_exchange_strong_explicit (C++11)(C++11)(C++11)(C++11) | atomically compares the value of the atomic object with non-atomic argument and performs atomic exchange if equal or atomic load if not (function template) |
© cppreference.com
在CreativeCommonsAttribution下授权-ShareAlike未移植许可v3.0。
本文档系腾讯云开发者社区成员共同维护,如有问题请联系 cloudcommunity@tencent.com