Spec-Zone.ru › C++

std::atomic_wait, std::atomic_wait_explicit

Определено в заголовочном файле <atomic>
template< class T >
void atomic_wait( const std::atomic<T>* object,
                  typename std::atomic<T>::value_type old );
(1) (начиная с C++20)
template< class T >
void atomic_wait( const volatile std::atomic<T>* object,
                  typename std::atomic<T>::value_type old );
(2) (начиная с C++20)
template< class T >
void atomic_wait_explicit( const std::atomic<T>* object, 
                           typename std::atomic<T>::value_type old, 
                           std::memory_order order );
(3) (начиная с C++20)
template< class T >
void atomic_wait_explicit( const volatile std::atomic<T>* object,
                           typename std::atomic<T>::value_type old, 
                           std::memory_order order );
(4) (начиная с C++20)

Выполняет атомарные операции ожидания. Ведёт себя так, как если бы многократно выполняла следующие шаги:

  • Сравнивает представление значения object->load() (для перегрузок (1,2)) или object->load(order) (для перегрузок (3,4)) с представлением значения old.
    • Если они побитово равны, функция блокируется до тех пор, пока *object не получит уведомление от std::atomic::notify_one() или std::atomic::notify_all() либо пока поток не будет разблокирован спонтанно.
    • В противном случае функция возвращает управление.

Гарантируется, что эти функции возвращают управление только в том случае, если значение изменилось, даже если реализация разблокирует поток спонтанно.

1,2) Эквивалентно object->wait(old).
3,4) Эквивалентно object->wait(old, order).
Если order равен одному из std::memory_order::release и std::memory_order::acq_rel, поведение не определено.

Параметры

object - указатель на атомарный объект, который нужно проверить и ожидать
old - значение, которого, как проверяется, больше нет в атомарном объекте
order - порядок синхронизации памяти

Возвращаемое значение

(нет)

Примечания

Такой способ обнаружения изменений часто эффективнее простого опроса или использования чистых спин-блокировок.

Из-за проблемы ABA временные изменения old на другое значение и обратно на old могут быть пропущены и не привести к разблокировке.

Сравнение выполняется побитово (аналогично std::memcmp); оператор сравнения не используется. Биты заполнения, которые никогда не участвуют в представлении значения объекта, игнорируются.

Пример

См. также

wait
(C++20)
блокирует поток до получения уведомления и изменения атомарного значения
(открытая функция-член std::atomic<T>)
notify_one
(C++20)
уведомляет как минимум один поток, ожидающий атомарный объект
(открытая функция-член std::atomic<T>)
notify_all
(C++20)
уведомляет все потоки, заблокированные в ожидании атомарного объекта
(открытая функция-член std::atomic<T>)
atomic_notify_one
(C++20)
уведомляет поток, заблокированный в atomic_wait
(шаблон функции)
atomic_notify_all
(C++20)
уведомляет все потоки, заблокированные в atomic_wait
(шаблон функции)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/atomic/atomic_wait

Spec-Zone.ru

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