23 General utilities library [utilities]

23.11 Smart pointers [smartptr]

23.11.2 Shared-ownership pointers [util.smartptr]

23.11.2.6 shared_­ptr atomic access [util.smartptr.shared.atomic]

Одновременный доступ к shared_­ptr объекту из нескольких потоков не приводит к гонке за данные, если доступ осуществляется исключительно через функции в этом разделе и экземпляр передается в качестве их первого аргумента.

Значение аргументов типа memory_­order объясняется в [atomics.order].

template<class T> bool atomic_is_lock_free(const shared_ptr<T>* p);

Requires: p не может быть нулевым.

Returns: true если атомарный доступ к *p свободен от блокировки, в false противном случае.

Throws: Ничего такого.

template<class T> shared_ptr<T> atomic_load(const shared_ptr<T>* p);

Requires: p не может быть нулевым.

Returns: atomic_­load_­explicit(p, memory_­order_­seq_­cst).

Throws: Ничего такого.

template<class T> shared_ptr<T> atomic_load_explicit(const shared_ptr<T>* p, memory_order mo);

Requires: p не может быть нулевым.

Requires: mo не должно быть memory_­order_­release или memory_­order_­acq_­rel.

Returns: *p.

Throws: Ничего такого.

template<class T> void atomic_store(shared_ptr<T>* p, shared_ptr<T> r);

Requires: p не может быть нулевым.

Effects: Как будто мимо atomic_­store_­explicit(p, r, memory_­order_­seq_­cst).

Throws: Ничего такого.

template<class T> void atomic_store_explicit(shared_ptr<T>* p, shared_ptr<T> r, memory_order mo);

Requires: p не может быть нулевым.

Requires: mo не должно быть memory_­order_­acquire или memory_­order_­acq_­rel.

Effects: Как будто мимо p->swap(r).

Throws: Ничего такого.

template<class T> shared_ptr<T> atomic_exchange(shared_ptr<T>* p, shared_ptr<T> r);

Requires: p не может быть нулевым.

Returns: atomic_­exchange_­explicit(p, r, memory_­order_­seq_­cst).

Throws: Ничего такого.

template<class T> shared_ptr<T> atomic_exchange_explicit(shared_ptr<T>* p, shared_ptr<T> r, memory_order mo);

Requires: p не может быть нулевым.

Effects: Как будто мимо p->swap(r).

Returns: Предыдущее значение *p.

Throws: Ничего такого.

template<class T> bool atomic_compare_exchange_weak(shared_ptr<T>* p, shared_ptr<T>* v, shared_ptr<T> w);

Requires: p не может быть нулевым и v не может быть нулевым.

Returns:

atomic_compare_exchange_weak_explicit(p, v, w, memory_order_seq_cst, memory_order_seq_cst)

Throws: Ничего такого.

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.

Returns: true если *p было эквивалентно *v, в false противном случае.

Throws: Ничего такого.

Remarks: Два shared_­ptr объекта эквивалентны, если они хранят одно и то же значение указателя и разделяют владение. Слабая форма может ложно потерпеть неудачу. Смотрите [atomics.types.operations].