Spec-Zone.ru › C++

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)
1) Инициализирует базовый weak_ptr<T> значением, полученным по умолчанию.
2) Инициализирует базовый weak_ptr<T> копией desired. Как инициализация любого типа std::atomic, эта инициализация не является атомарной операцией.
3) Атомарные типы не поддерживают конструирование копированием или перемещением.

atomic<weak_ptr<T>>::operator=

void operator=( const atomic& ) = delete;
(1)
void operator=( std::weak_ptr<T> desired ) noexcept;
(2) (constexpr начиная с C++26)
1) Атомарные типы не поддерживают присваивание копированием или перемещением.
2) Присваивание значения, эквивалентное 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)
1) Если базовый std::weak_ptr<T> хранит то же значение указателя, что и 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.
2) То же, что и (1), но операция также может завершиться неудачей без видимой причины.
3) Эквивалентно 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.
4) Эквивалентно 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>

Пример

См. также

atomic
(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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API