std::atomic_...<std::shared_ptr>
Определено в заголовочном файле <memory> | ||
template<class T > bool atomic_is_lock_free(conststd::shared_ptr<T>* p ); | (1) | (начиная с C++11) (устарело в C++20) |
template<class T > std::shared_ptr<T> atomic_load(conststd::shared_ptr<T>* p ); | (2) | (начиная с C++11) (устарело в C++20) |
template<class T > std::shared_ptr<T> atomic_load_explicit(conststd::shared_ptr<T>* p, | (3) | (начиная с C++11) (устарело в C++20) |
template<class T > void atomic_store(std::shared_ptr<T>* p, | (4) | (начиная с C++11) (устарело в C++20) |
template<class T > void atomic_store_explicit(std::shared_ptr<T>* p, | (5) | (начиная с C++11) (устарело в C++20) |
template<class T > std::shared_ptr<T> atomic_exchange(std::shared_ptr<T>* p, | (6) | (начиная с C++11) (устарело в C++20) |
template<class T> std::shared_ptr<T> atomic_exchange_explicit(std::shared_ptr<T>* p, | (7) | (начиная с C++11) (устарело в C++20) |
template<class T > bool atomic_compare_exchange_weak(std::shared_ptr<T>* p, | (8) | (начиная с C++11) (устарело в C++20) |
template<class T> bool atomic_compare_exchange_strong(std::shared_ptr<T>* p, | (9) | (начиная с C++11) (устарело в C++20) |
template<class T > bool atomic_compare_exchange_strong_explicit(std::shared_ptr<T>* p, | (10) | (начиная с C++11) (устарело в C++20) |
template<class T > bool atomic_compare_exchange_weak_explicit(std::shared_ptr<T>* p, | (11) | (начиная с C++11) (устарело в C++20) |
Если несколько потоков выполнения обращаются к одному и тому же объекту std::shared_ptr без синхронизации, и любой из этих доступов использует неконстантную функцию-элемент shared_ptr, тогда произойдёт гонка данных, если только все такие доступы не осуществляются через эти функции, которые являются перегрузками соответствующих атомарных функций доступа (std::atomic_load, std::atomic_store и т.д.)
Обратите внимание, что блок управления shared_ptr является потокобезопасным: доступ к различным объектам std::shared_ptr можно получить с помощью mutable операций, таких как operator= или reset, одновременно нескольким потокам, даже если эти экземпляры являются копиями и используют один и тот же внутренний блок управления.
std::memory_order_seq_cst).
std::memory_order_seq_cst).
Все эти функции вызывают неопределённое поведение, если p является нулевым указателем.
Содержание |
[править]Параметры
p, expected | — | указатель на std::shared_ptr |
r, desired | — | std::shared_ptr |
mo, success, failure | — | селекторы порядка памяти типа std::memory_order |
[править]Исключения
Эти функции не генерируют исключений.
[править]Возвращаемое значение
[править]Примечание
Эти функции обычно реализуются с помощью мьютексов, хранящихся в глобальной хеш-таблице, где значение указателя используется в качестве ключа.
Чтобы избежать гонок данных, после передачи общего указателя любой из этих функций доступ к нему неатомарным образом становится невозможен. В частности, вы не можете разыменовать такой объект shared_ptr, не загрузив его сначала атомарно в другой объект shared_ptr, а затем разыменовав второй объект.
ТС Конкуренции предлагает атомарные классы умных указателей atomic_shared_ptr
и atomic_weak_ptr
в качестве замены использования этих функций.
Эти функции устарели в пользу специализаций шаблона std::atomic: std::atomic<std::shared_ptr> и std::atomic<std::weak_ptr>. | (начиная с C++20) |
[править]Пример
Этот раздел не завершён Причина: нет примера |
[править]Отчёты о дефектах
Следующие изменения поведения были применены с обратной силой к ранее опубликованным стандартам C++:
Номер | Применён | Поведение в стандарте | Корректное поведение |
---|---|---|---|
LWG 2980 | C++11 | пустые shared_ptr никогда не эквивалентны | эквивалентны, если они хранят одно и то же значение указателя |
[править]Смотрите также
(C++11) | проверяет, являются ли операции атомарного типа неблокирующими (шаблон функции) |
(C++11)(C++11) | атомарно заменяет значение атомарного объекта неатомарным аргументом (шаблон функции) |
(C++11)(C++11) | атомарно получает значение, хранящееся в атомарном объекте (шаблон функции) |
(C++11)(C++11) | атомарно заменяет значение атомарного объекта неатомарным аргументом и возвращает предыдущее атомарное значение (шаблон функции) |
атомарно сравнивает значение атомарного объекта с неатомарным аргументом и выполняет атомарный обмен, если они равны, или атомарную загрузку, если нет (шаблон функции) |