std::atomic_...<std::shared_ptr>
Определён в заголовочном файле <memory> | ||
|---|---|---|
template< class T > bool atomic_is_lock_free( const std::shared_ptr<T>* p ); | (1) | (начиная с C++11) (устарело в C++20) (удалено в C++26) |
template< class T > std::shared_ptr<T> atomic_load( const std::shared_ptr<T>* p ); | (2) | (начиная с C++11) (устарело в C++20) (удалено в C++26) |
template< class T >
std::shared_ptr<T> atomic_load_explicit
( const std::shared_ptr<T>* p, std::memory_order mo );
| (3) | (начиная с C++11) (устарело в C++20) (удалено в C++26) |
template< class T > void atomic_store( std::shared_ptr<T>* p, std::shared_ptr<T> r ); | (4) | (начиная с C++11) (устарело в C++20) (удалено в C++26) |
template< class T >
void atomic_store_explicit
( std::shared_ptr<T>* p, std::shared_ptr<T> r,
std::memory_order mo );
| (5) | (начиная с C++11) (устарело в C++20) (удалено в C++26) |
template< class T >
std::shared_ptr<T> atomic_exchange
( std::shared_ptr<T>* p, std::shared_ptr<T> r );
| (6) | (начиная с C++11) (устарело в C++20) (удалено в C++26) |
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) | (начиная с C++11) (устарело в C++20) (удалено в C++26) |
template< class T >
bool atomic_compare_exchange_weak
( std::shared_ptr<T>* p, std::shared_ptr<T>* expected,
std::shared_ptr<T> desired );
| (8) | (начиная с C++11) (устарело в C++20) (удалено в C++26) |
template< class T >
bool atomic_compare_exchange_strong
( std::shared_ptr<T>* p, std::shared_ptr<T>* expected,
std::shared_ptr<T> desired );
| (9) | (начиная с C++11) (устарело в C++20) (удалено в C++26) |
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) | (начиная с C++11) (устарело в C++20) (удалено в C++26) |
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) | (начиная с C++11) (устарело в C++20) (удалено в C++26) |
Если несколько потоков выполнения обращаются к одному и тому же объекту std::shared_ptr без синхронизации и хотя бы одно из этих обращений использует неконстантную функцию-член shared_ptr, возникает гонка данных, если только все такие обращения не выполняются с помощью этих функций, являющихся перегрузками соответствующих атомарных функций доступа (std::atomic_load, std::atomic_store и т. д.).
Обратите внимание, что управляющий блок shared_ptr является потокобезопасным: разные объекты std::shared_ptr можно одновременно изменять в нескольких потоках с помощью изменяющих операций, таких как operator= или reset, даже если эти экземпляры являются копиями и внутренне используют один и тот же управляющий блок.
p, без блокировок.atomic_load_explicit(p, std::memory_order_seq_cst).p.std::atomic_load_explicit, если mo равен std::memory_order_release или std::memory_order_acq_rel, поведение не определено.atomic_store_explicit(p, r, std::memory_order_seq_cst).r в разделяемом указателе, на который указывает p, как если бы это выполнялось с помощью p->swap(r).std::atomic_store_explicit, если mo равен std::memory_order_acquire или std::memory_order_acq_rel, поведение не определено.atomic_exchange_explicit(p, r, std::memory_order_seq_cst).r в разделяемом указателе, на который указывает p, и возвращает значение, на которое ранее указывал p, как если бы это выполнялось с помощью p->swap(r), возвращая копию r после обмена.atomic_compare_exchange_weak_explicit(p, expected, desired, std::memory_order_seq_cst,std::memory_order_seq_cst).atomic_compare_exchange_strong_explicit(p, expected, desired, std::memory_order_seq_cst,std::memory_order_seq_cst).p и expected. - Если они эквивалентны (хранят одно и то же значение указателя и либо совместно владеют одним объектом, либо оба пусты), присваивает
desiredв*pс ограничениями на порядок доступа к памяти, заданнымиsuccess, и возвращаетtrue. - Если они не эквивалентны, присваивает
*pв*expectedс ограничениями на порядок доступа к памяти, заданнымиfailure, и возвращаетfalse.
atomic_compare_exchange_weak_explicit может завершиться неудачей без видимой причины.expected является нулевым указателем или failure равен std::memory_order_release или std::memory_order_acq_rel, поведение не определено.Если p является нулевым указателем, поведение всех этих функций не определено.
Параметры
| p, expected | - | указатель на std::shared_ptr |
| r, desired | - | std::shared_ptr |
| mo, success, failure | - | параметры выбора порядка доступа к памяти типа std::memory_order |
Исключения
Эти функции не генерируют исключений.
Возвращаемое значение
true, если атомарный доступ реализован с помощью инструкций без блокировок.true, если разделяемые указатели были эквивалентны и обмен был выполнен, иначе false.Примечания
Обычно эти функции реализуются с помощью мьютексов, хранящихся в глобальной хеш-таблице, где значение указателя используется в качестве ключа.
Concurrency TS предлагает классы атомарных интеллектуальных указателей atomic_shared_ptr и atomic_weak_ptr в качестве замены использования этих функций.
| Эти функции устарели; вместо них следует использовать специализации шаблона |
(начиная с C++20) (до C++26) |
| Эти функции удалены; вместо них следует использовать специализации шаблона | (начиная с C++26) |
Пример
Отчёты об ошибках
Следующие отчёты об ошибках, изменяющие поведение, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Применено к | Поведение в опубликованном стандарте | Исправленное поведение |
|---|---|---|---|
| LWG 2172 | C++11 |
expected мог быть нулевым указателем | в этом случае поведение не определено |
| LWG 2980 | C++11 | пустые shared_ptr никогда не были эквивалентны | эквивалентны, если хранят одно и то же значение указателя |
См. также
|
(C++11) | проверяет, выполняются ли операции атомарного типа без блокировок (шаблон функции) |
|
(C++11)(C++11) | атомарно заменяет значение атомарного объекта неатомарным аргументом (шаблон функции) |
|
(C++11)(C++11) | атомарно получает значение, хранящееся в атомарном объекте (шаблон функции) |
|
(C++11)(C++11) | атомарно заменяет значение атомарного объекта неатомарным аргументом и возвращает прежнее значение атомарного объекта (шаблон функции) |
|
(C++11)(C++11)(C++11)(C++11) | атомарно сравнивает значение атомарного объекта с неатомарным аргументом и выполняет атомарный обмен при равенстве либо атомарную загрузку в противном случае (шаблон функции) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/memory/shared_ptr/atomic