Spec-Zone.ru › C++

std::atomic_wait, std::atomic_wait_explicit

template< class T >
void atomic_wait( const std::atomic<T>* object,
                  typename std::atomic<T>::value_type old );
(1) (since C++20)
template< class T >
void atomic_wait( const volatile std::atomic<T>* object,
                  typename std::atomic<T>::value_type old );
(2) (since 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) (since 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) (since 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/w/cpp/atomic/atomic_wait

Spec-Zone.ru

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