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()либо пока поток не будет разблокирован спонтанно. - В противном случае функция возвращает управление.
- Если они побитово равны, функция блокируется до тех пор, пока
Гарантируется, что эти функции возвращают управление только в том случае, если значение изменилось, даже если реализация разблокирует поток спонтанно.
object->wait(old).object->wait(old, order).order равен одному из std::memory_order::release и std::memory_order::acq_rel, поведение не определено.Параметры
| object | - | указатель на атомарный объект, который нужно проверить и ожидать |
| old | - | значение, которого, как проверяется, больше нет в атомарном объекте |
| order | - | порядок синхронизации памяти |
Возвращаемое значение
(нет)
Примечания
Такой способ обнаружения изменений часто эффективнее простого опроса или использования чистых спин-блокировок.
Из-за проблемы ABA временные изменения old на другое значение и обратно на old могут быть пропущены и не привести к разблокировке.
Сравнение выполняется побитово (аналогично std::memcmp); оператор сравнения не используется. Биты заполнения, которые никогда не участвуют в представлении значения объекта, игнорируются.
Пример
См. также
|
(C++20) | блокирует поток до получения уведомления и изменения атомарного значения (открытая функция-член std::atomic<T>) |
|
(C++20) | уведомляет как минимум один поток, ожидающий атомарный объект (открытая функция-член std::atomic<T>) |
|
(C++20) | уведомляет все потоки, заблокированные в ожидании атомарного объекта (открытая функция-член std::atomic<T>) |
|
(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_wait