std::atomic...it_explicit(3)
π std::atomic_wait, std::atomic_wait_explicit
okay so bestie, welcome to the C++ Standard Libary manual (yes the manual itself spells it like that, we are NOT fixing it, it's iconic in its own way π). Today's main character energy: std::atomic_wait and std::atomic_wait_explicit β the "just tell me when it changes" girlies of the C++20 atomics world. β¨
πΈ NAME πΈ
std::atomic_wait, std::atomic_wait_explicit β literally the functions std::atomic_wait and std::atomic_wait_explicit, no cap π
π¦ Synopsis π¦
Four overloads, all since C++20, all serving looks in slightly different ways:
template< class T >
void atomic_wait( const std::atomic<T>* object,
(1) (since C++20)
typename std::atomic<T>::value_type old );
template< class T >
void atomic_wait( const volatile std::atomic<T>* object,
(2) (since C++20)
typename std::atomic<T>::value_type old );
template< class T >
void atomic_wait_explicit( const std::atomic<T>* object,
typename std::atomic<T>::value_type
(3) (since C++20)
old,
std::memory_order order );
template< class T >
void atomic_wait_explicit( const volatile std::atomic<T>* object,
typename std::atomic<T>::value_type
(4) (since C++20)
old,
std::memory_order order );
π DESCRIPTION π (the actual vibe)
So these bad boys perform atomic waiting operations. Behaves as if it repeatedly performs the following steps, on loop, like it's refreshing your story views:
- Compare the value representation of
object->load()(for overloads (1,2)) orobject->load(order)(for overloads (3,4)) with that ofold.- If those are bitwise equal, then it blocks until
*objectis notified bystd::atomic::notify_one()orstd::atomic::notify_all(), or the thread is unblocked spuriously. - Otherwise, it returns. Bye bestie π
- If those are bitwise equal, then it blocks until
These functions are guaranteed to return only if value has changed, even if the underlying implementation unblocks spuriously. So no fake awakenings, she's not here for that π
- 1,2) Equivalent to
object->wait(old). - 3,4) Equivalent to
object->wait(old, order).
β οΈ Iforderis one ofstd::memory_order::releaseandstd::memory_order::acq_rel, the behavior is undefined. That's not a vibe, that's a trap. π¨
π 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 β‘
π Return value π
(none)
literally nothing. she gives you no return value. she just does the thing. periodt. π
π Notes π
This form of change-detection is often highkey more efficient than simple polling or pure spinlocks. slay π§
π Due to the ABA problem, transient changes fromoldto another value and back tooldmight be missed, and not unblock. so likeβ¦ she might just not notice. not her fault, it's the ABA problem's fault.
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. iykyk π₯
π Example π
This section is incomplete Reason: no example
(we're not going to lie to you, bestie β there's just no example here. the page literally says so. the audacity. π)
π See also π
waitβ blocks the thread until notified and the atomic value changes β (C++20) β public member function ofstd::atomic<T>π«Άnotify_oneβ notifies at least one thread waiting on the atomic object β (C++20) β public member function ofstd::atomic<T>πnotify_allβ notifies all threads blocked waiting on the atomic object β (C++20) β public member function ofstd::atomic<T>π£atomic_notify_oneβ notifies a thread blocked inatomic_waitβ (C++20) β function template βatomic_notify_allβ notifies all threads blocked inatomic_waitβ (C++20) β function template π
πΈ Category πΈ
- Todo no example
and that's the whole page bestie!! π this one's from http://cppreference.com, version 2024.06.10 β go off, you understood all of it, i'm obsessed, mwah ππ
β¨
π¦ where this page comes from
- nixpkgs unstable: stdman 2024.07.05
- opensuse-leap 16.0: stdman 2024.07.05-bp160.1.9 Β· MIT
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms