在线文档教程
C++
应用 | Utilities

std::atomic_...<std::shared_ptr>

STD::原子[医]...<STD::Shared[医]PTR>

template< class T > bool atomic_is_lock_free( const std::shared_ptr* 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_releasestd::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比较所指向的共享指针pexpected如果它们相等于相同指针的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_ptratomic_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。

http://en.cppreference.com/w/cpp/Memory/Shared[医]PTR/原子