std::atomic_flag::wait
void wait( bool old, std::memory_order order =
std::memory_order_seq_cst ) const noexcept;
| (1) |
(начиная с C++20) (constexpr начиная с C++26) |
void wait( bool old,
std::memory_order order =
std::memory_order_seq_cst ) const volatile noexcept;
| (2) | (начиная с C++20) |
Выполняет операции атомарного ожидания. Ведёт себя так, как если бы многократно выполнял следующие действия:
- Сравнивает
this->test(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_flag больше не содержит |
| order | - | ограничения на порядок операций с памятью, которые необходимо обеспечить |
Примечания
Такой способ обнаружения изменений зачастую эффективнее простого опроса или использования исключительно спин-блокировок.
Из-за проблемы ABA временные изменения old на другое значение и обратно на old могут быть пропущены и не привести к разблокировке.
Пример
См. также
|
(C++20) | уведомляет как минимум один поток, ожидающий атомарный объект (открытая функция-член) |
|
(C++20) | уведомляет все потоки, заблокированные в ожидании атомарного объекта (открытая функция-член) |
|
(C++20) | уведомляет поток, заблокированный в atomic_flag_wait (функция) |
|
(C++20) | уведомляет все потоки, заблокированные в atomic_flag_wait (функция) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/atomic/atomic_flag/wait