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) |
template< class T > std::shared_ptr<T> atomic_load( const std::shared_ptr<T>* p ); | (2) | (с C++11) (устарело в C++20) |
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) |
template< class T > void atomic_store( std::shared_ptr<T>* p, std::shared_ptr<T> r ); | (4) | (с C++11) (устарело в C++20) |
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) |
template< class T >
std::shared_ptr<T> atomic_exchange
( std::shared_ptr<T>* p, std::shared_ptr<T> r );
| (6) | (с C++11) (устарело в C++20) |
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) |
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) |
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) |
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) |
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) |
Если несколько потоков выполнения обращаются к одному объекту std::shared_ptr без синхронизации, и любое из этих обращений использует неконстантный член-функцию объекта shared_ptr, то произойдет гонка данных, если все такие обращения не будут выполняться через эти функции, которые являются перегрузками соответствующих атомарных функций доступа (std::atomic_load, std::atomic_store, и т. д.).
Обратите внимание, что управляющий блок shared_ptr защищён от одновременного доступа: различные объекты std::shared_ptr могут быть обработаны с помощью изменяемых операций, таких как оператор= или 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_release или 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 в противном случае.Примечания
Эти функции обычно реализуются с использованием мьютексов, хранящихся в глобальной хеш-таблице, где значение указателя используется в качестве ключа.
TS по конкурентности предлагает классы атомарных умных указателей atomic_shared_ptr и atomic_weak_ptr как замену для использования этих функций.
| Эти функции были устаревши в пользу специализаций шаблона | (с C++20) |
Пример
Отчёты о дефектах
Следующие отчёты о дефектах, которые изменяют поведение, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Применено к | Поведение, как опубликовано | Правильное поведение |
|---|---|---|---|
| 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/w/cpp/memory/shared_ptr/atomic