std::atomic_ref<T>::wait
void wait( value_type old, std::memory_order order =
std::memory_order_seq_cst ) const noexcept;
| (constexpr с C++26) |
Выполняет операции атомарного ожидания. Ведёт себя так, как если бы многократно выполнялись следующие шаги:
- Сравнивает представление значения
this->load(order)с представлением значенияold.- Если они равны, блокирует поток до тех пор, пока
*thisне будет уведомлён с помощьюnotify_one()илиnotify_all(), либо пока поток не будет разблокирован ложно. - В противном случае возвращает управление.
- Если они равны, блокирует поток до тех пор, пока
Гарантируется, что эти функции возвращают управление только в том случае, если значение изменилось, даже если нижележащая реализация разблокировала поток ложно.
Если order не является std::memory_order_relaxed, std::memory_order_consume, std::memory_order_acquire или std::memory_order_seq_cst, поведение не определено.
Параметры
| old | - | значение, которое проверяется на то, что объект atomic_ref больше не содержит |
| order | - | ограничения на порядок памяти, которые необходимо соблюдать |
Примечания
Такой способ обнаружения изменений зачастую эффективнее простого опроса или использования чистых спинлоков.
Из-за проблемы ABA временные изменения old на другое значение и обратно на old могут остаться незамеченными и не привести к разблокировке.
Сравнение выполняется побитово (аналогично std::memcmp); оператор сравнения не используется. Биты заполнения, которые никогда не участвуют в представлении значения объекта, игнорируются.
Пример
См. также
| уведомляет как минимум один поток, ожидающий атомарный объект (открытая функция-член) |
|
| уведомляет все потоки, ожидающие атомарный объект (открытая функция-член) |
|
|
(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/cpp/atomic/atomic_ref/wait