std::atomic_ref<T>::wait
void wait( T old, std::memory_order order =
std::memory_order::seq_cst ) const noexcept;
| (1) | (since C++20) |
void wait( T old, std::memory_order order =
std::memory_order::seq_cst ) const volatile noexcept;
| (2) | (since C++20) |
Выполняет атомные операции ожидания. Ведёт себя так, как будто она многократно выполняет следующие шаги:
- Сравнивает представление значения объекта
this->load(order)с представлением значенияold.- Если они равны, то блокируется до тех пор, пока
*thisне будет уведомленаnotify_one()илиnotify_all(), или поток не будет разблокирован случайным образом. - В противном случае, возвращает значение.
- Если они равны, то блокируется до тех пор, пока
Эти функции гарантированно возвращают значение только в том случае, если значение изменилось, даже если внутренняя реализация случайным образом разблокирует поток.
Если order является одним из std::memory_order::release и std::memory_order::acq_rel, поведение не определено.
Параметры
| old | - | значение, с которым проверяется, содержит ли объект atomic_ref то же значение |
| order | - | ограничения порядка памяти, которые необходимо соблюдать |
Возвращаемое значение
(нет)
Примечания
Этот способ обнаружения изменений часто эффективнее, чем простое опрошивание или чистые спин-блоки.
Из-за проблемы ABA, временные изменения от old к другому значению и обратно к old могут быть пропущены, и поток не разблокируется.
Сравнение выполняется поразрядно (аналогично std::memcmp); оператор сравнения не используется. Битам заполнения, которые никогда не участвуют в представлении значения объекта, игнорируются.
Пример
См. также
|
(C++20) | уведомляет как минимум один ожидающий поток об атомном объекте (публичный член-функция) |
|
(C++20) | уведомляет все заблокированные потоки, ожидающие атомного объекта (публичный член-функция) |
|
(C++20) | уведомляет заблокированный поток в atomic_wait (шаблон функции) |
|
(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_ref/wait