std::atomic<std::weak_ptr>
Определён в заголовочном файле <memory> | ||
|---|---|---|
template< class T > struct std::atomic<std::weak_ptr<T>>; | (начиная с C++20) |
Частичная специализация шаблона std::atomic для std::weak_ptr<T> позволяет пользователям атомарно работать с объектами weak_ptr. T может быть неполным типом.
Если несколько потоков выполнения обращаются к одному и тому же объекту std::weak_ptr без синхронизации и хотя бы одно из этих обращений использует неконстантную функцию-член weak_ptr, возникает гонка данных, если только все такие обращения не выполняются через экземпляр std::atomic<std::weak_ptr>.
Связанные инкременты use_count гарантированно являются частью атомарной операции. Связанные декременты use_count упорядочены после атомарной операции, но не обязаны быть её частью, за исключением изменения use_count при переопределении expected в неудачном CAS. Любое связанное удаление и освобождение памяти упорядочены после шага атомарного обновления и не являются частью атомарной операции.
Обратите внимание, что блок управления, используемый std::weak_ptr и std::shared_ptr, является потокобезопасным: с разными неатомарными объектами std::weak_ptr можно одновременно выполнять изменяющие операции, например operator= или reset, из нескольких потоков, даже если эти экземпляры являются копиями или иным образом используют один и тот же блок управления.
Вложенные типы
| Тип | Определение |
|---|---|
value_type | std::weak_ptr<T> |
Функции-члены
Эта специализация также предоставляет все неспециализированные функции std::atomic и не имеет дополнительных функций-членов.
atomic<weak_ptr<T>>::atomic
constexpr atomic() noexcept = default; | (1) | |
atomic( std::weak_ptr<T> desired ) noexcept; | (2) | (constexpr начиная с C++26) |
atomic( const atomic& ) = delete; | (3) |
weak_ptr<T> значением, полученным по умолчанию.weak_ptr<T> копией desired. Как инициализация любого типа std::atomic, эта инициализация не является атомарной операцией.atomic<weak_ptr<T>>::operator=
void operator=( const atomic& ) = delete; | (1) | |
void operator=( std::weak_ptr<T> desired ) noexcept; | (2) | (constexpr начиная с C++26) |
store(desired). atomic<weak_ptr<T>>::is_lock_free
bool is_lock_free() const noexcept; |
Возвращает true, если атомарные операции над всеми объектами этого типа выполняются без блокировок, и false в противном случае.
atomic<weak_ptr<T>>::store
void store( std::weak_ptr<T> desired,
std::memory_order order = std::memory_order_seq_cst ) noexcept;
| (constexpr начиная с C++26) |
Атомарно заменяет значение *this значением desired, как если бы выполнялось p.swap(desired), где p — базовый std::weak_ptr<T>. Порядок доступа к памяти определяется order.
Если order имеет значение std::memory_order_consume, std::memory_order_acquire или std::memory_order_acq_rel, поведение не определено.
atomic<weak_ptr<T>>::load
std::weak_ptr<T> load( std::memory_order order =
std::memory_order_seq_cst ) const noexcept;
| (constexpr начиная с C++26) |
Атомарно возвращает копию базового std::weak_ptr<T>. Порядок доступа к памяти определяется order.
Если order имеет значение std::memory_order_release или std::memory_order_acq_rel, поведение не определено.
atomic<weak_ptr<T>>::operator std::weak_ptr<T>
operator std::weak_ptr<T>() const noexcept; | (constexpr начиная с C++26) |
Эквивалентно return load();.
atomic<weak_ptr<T>>::exchange
std::weak_ptr<T> exchange( std::weak_ptr<T> desired,
std::memory_order order =
std::memory_order_seq_cst ) noexcept;
| (constexpr начиная с C++26) |
Атомарно заменяет базовый std::weak_ptr<T> значением desired, как если бы выполнялось p.swap(desired), где p — базовый std::weak_ptr<T>, и возвращает копию значения, которое p имел непосредственно перед обменом. Порядок доступа к памяти определяется order. Это атомарная операция чтения-модификации-записи.
atomic<weak_ptr<T>>::compare_exchange_weak, compare_exchange_strong
bool compare_exchange_strong
( std::weak_ptr<T>& expected, std::weak_ptr<T> desired,
std::memory_order success, std::memory_order failure ) noexcept;
| (1) | (constexpr начиная с C++26) |
bool compare_exchange_weak
( std::weak_ptr<T>& expected, std::weak_ptr<T> desired,
std::memory_order success, std::memory_order failure ) noexcept;
| (2) | (constexpr начиная с C++26) |
bool compare_exchange_strong
( std::weak_ptr<T>& expected, std::weak_ptr<T> desired,
std::memory_order order = std::memory_order_seq_cst ) noexcept;
| (3) | (constexpr начиная с C++26) |
bool compare_exchange_weak
( std::weak_ptr<T>& expected, std::weak_ptr<T> desired,
std::memory_order order = std::memory_order_seq_cst ) noexcept;
| (4) | (constexpr начиная с C++26) |
expected, и разделяет с ним владение, либо если оба объекта — базовый и expected — пусты, присваивает базовому std::weak_ptr<T> значение desired, возвращает true и упорядочивает доступ к памяти согласно success; в противном случае присваивает expected значение базового std::weak_ptr<T>, возвращает false и упорядочивает доступ к памяти согласно failure. - В случае успеха операция является атомарной операцией чтения-модификации-записи над
*this, и после атомарного обновления кexpectedбольше не обращаются. - В случае неудачи операция является атомарной операцией загрузки над
*this, аexpectedобновляется значением, считанным из атомарного объекта. Это обновление use_count объектаexpectedявляется частью данной атомарной операции, хотя сама запись (и любое последующее освобождение памяти или уничтожение) не обязана быть её частью.
failure имеет значение std::memory_order_release или std::memory_order_acq_rel.return compare_exchange_strong(expected, desired, order, fail_order);, где fail_order совпадает с order, за исключением того, что std::memory_order_acq_rel заменяется на std::memory_order_acquire, а std::memory_order_release — на std::memory_order_relaxed.return compare_exchange_weak(expected, desired, order, fail_order);, где fail_order совпадает с order, за исключением того, что std::memory_order_acq_rel заменяется на std::memory_order_acquire, а std::memory_order_release — на std::memory_order_relaxed. atomic<weak_ptr<T>>::wait
void wait( std::weak_ptr<T> old
std::memory_order order =
std::memory_order_seq_cst ) const noexcept;
| (constexpr начиная с C++26) |
Выполняет атомарную операцию ожидания.
Сравнивает load(order) с old и, если они эквивалентны, блокирует выполнение до тех пор, пока *this не будет уведомлен вызовом notify_one() или notify_all(). Это повторяется, пока load(order) не изменится. Гарантируется, что эта функция вернётся только после изменения значения, даже если базовая реализация разблокирует её без видимой причины. Порядок доступа к памяти определяется order.
Если order имеет значение std::memory_order_release или std::memory_order_acq_rel, поведение не определено.
Примечание: два объекта std::weak_ptr эквивалентны, если они хранят один и тот же указатель и либо разделяют владение, либо оба пусты.
atomic<weak_ptr<T>>::notify_one
void notify_one() noexcept; | (constexpr начиная с C++26) |
Выполняет атомарную операцию уведомления.
Если какой-либо поток заблокирован в ожидании атомарной операции (то есть выполняет wait()) на *this, разблокирует как минимум один такой поток; в противном случае ничего не делает.
atomic<weak_ptr<T>>::notify_all
void notify_all() noexcept; | (constexpr начиная с C++26) |
Выполняет атомарную операцию уведомления.
Разблокирует все потоки, заблокированные в ожидании атомарной операции (то есть выполняющие wait()) на *this (если такие есть).
Константы-члены
Эта специализация также предоставляет единственную стандартную константу-член is_always_lock_free типа std::atomic.
atomic<weak_ptr<T>>::is_always_lock_free
static constexpr bool is_always_lock_free = /* implementation-defined */; |
Примечания
| Макрос проверки поддержки возможностей | Значение | Стандарт | Возможность |
|---|---|---|---|
__cpp_lib_constexpr_memory | 202506L | (C++26) | Constexpr std::atomic<std::weak_ptr> |
Пример
См. также
|
(C++11) | шаблон класса atomic и специализации для типов bool, целочисленных, с плавающей точкой,(начиная с C++20) и указателей (шаблон класса) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/memory/weak_ptr/atomic2