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(), или поток будет разблокирован спонтанно. - В противном случае возвращается.
- Если они битово равны, то блокируется до тех пор, пока
Гарантируется, что эти функции возвращаются только в случае изменения значения, даже если подлежащая реализация разблокирует поток спонтанно.
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/w/cpp/atomic/atomic_wait