Одновременный доступ к shared_ptr объекту из нескольких потоков не приводит к гонке за данные, если доступ осуществляется исключительно через функции в этом разделе и экземпляр передается в качестве их первого аргумента.
template<class T>
bool atomic_is_lock_free(const shared_ptr<T>* p);
template<class T>
void atomic_store(shared_ptr<T>* p, shared_ptr<T> r);
template<class T>
void atomic_store_explicit(shared_ptr<T>* p, shared_ptr<T> r, memory_order mo);
template<class T>
shared_ptr<T> atomic_exchange(shared_ptr<T>* p, shared_ptr<T> r);
template<class T>
shared_ptr<T> atomic_exchange_explicit(shared_ptr<T>* p, shared_ptr<T> r, memory_order mo);
template<class T>
bool atomic_compare_exchange_weak(shared_ptr<T>* p, shared_ptr<T>* v, shared_ptr<T> w);
Returns:
atomic_compare_exchange_weak_explicit(p, v, w, memory_order_seq_cst, memory_order_seq_cst)
template<class T>
bool atomic_compare_exchange_strong(shared_ptr<T>* p, shared_ptr<T>* v, shared_ptr<T> w);
Returns:
atomic_compare_exchange_strong_explicit(p, v, w, memory_order_seq_cst, memory_order_seq_cst)
template<class T>
bool atomic_compare_exchange_weak_explicit(
shared_ptr<T>* p, shared_ptr<T>* v, shared_ptr<T> w,
memory_order success, memory_order failure);
template<class T>
bool atomic_compare_exchange_strong_explicit(
shared_ptr<T>* p, shared_ptr<T>* v, shared_ptr<T> w,
memory_order success, memory_order failure);
Requires: p не может быть нулевым и v не может быть нулевым. failure Аргумент не должен быть memory_order_release ни memory_order_acq_rel.
Effects: Если *p эквивалентно *v, правопреемниками w до *p и имеет семантику синхронизации , соответствующие значению success, в противном случае присваивает *p к *v и имеет семантику синхронизации , соответствующий значению failure.
Remarks: Два shared_ptr объекта эквивалентны, если они хранят одно и то же значение указателя и разделяют владение. Слабая форма может ложно потерпеть неудачу. Смотрите [atomics.types.operations].