# std::atomic_wait, std::atomic_wait_explicit

From cppreference.com
< cpp‎ | atomic

Defined in header `<atomic>` |  |
| (1) | (since C++20)
template< class T > void atomic_wait( const std::atomic<T>* object, typename std::atomic<T>::value_type old ); |  |
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 ); |  |
template< class T > void atomic_wait_explicit( const volatile std::atomic<T>* object, typename std::atomic<T>::value_type old, std::memory_order order ); |  |

Performs atomic waiting operations. Behaves as if it repeatedly performs the following steps:

- Compare the value representation of object->load(std::memory_order_seq_cst) or object->load(order) with that of `old`.
  - If those are bitwise equal, then blocks until *object is notified by std::atomic::notify_one() or std::atomic::notify_all(), or the thread is unblocked spuriously.
  - Otherwise, returns.

These functions are guaranteed to return only if value has changed, even if the underlying implementation unblocks spuriously.

1) Equivalent to object->wait(old, std::memory_order_seq_cst).
2) Equivalent to object->wait(old, order).

### Parameters

object | - | pointer to the atomic object to check and wait on
old | - | the value to check the atomic object no longer contains
order | - | the memory synchronization ordering for this operation: must not be std::memory_order::release or std::memory_order::acq_rel

### Return value

(none)

### Notes

This form of change-detection is often more efficient than simple polling or pure spinlocks.

Due to the ABA problem, transient changes from `old` to another value and back to `old` might be missed, and not unblock.

The comparison is bitwise (similar to std::memcmp); no comparison operator is used. Padding bits that never participate in an object's value representation are ignored.

### Example

| This section is incomplete Reason: no example

### See also

notify_one (C++20) | notifies at least one thread waiting on the atomic object (public member function of `std::atomic<T>`)
notify_all (C++20) | notifies all threads blocked waiting on the atomic object (public member function of `std::atomic<T>`)
atomic_notify_one (C++20) | notifies a thread blocked in atomic_wait (function template)
atomic_notify_all (C++20) | notifies all threads blocked in atomic_wait (function template)

Retrieved from "https://en.cppreference.com/mwiki/index.php?title=cpp/atomic/atomic_wait&oldid=153683"