std::atomic_ref<T>::wait
void wait( value_type old, std::memory_order order = std::memory_order_seq_cst ) const noexcept; |
(constexpr seit C++26) | |
Führt atomare Wartevorgänge durch. Verhält sich so, als würde es wiederholt die folgenden Schritte ausführen:
- Vergleicht die Wertdarstellung von this->load(order) mit der von old.
- Wenn diese gleich sind, blockiert die Ausführung, bis *this durch notify_one() oder notify_all() benachrichtigt wird oder der Thread aus anderen Gründen (spurious wakeup) aufgeweckt wird.
- Andernfalls wird zurückgekehrt.
Diese Funktionen geben garantiert nur zurück, wenn sich der Wert geändert hat, auch wenn die zugrunde liegende Implementierung fälschlicherweise entblockiert.
Wenn order nicht std::memory_order_relaxed, std::memory_order_consume, std::memory_order_acquire oder std::memory_order_seq_cst ist, ist das Verhalten undefiniert.
Inhalt |
[bearbeiten] Parameter
| old | - | Der Wert, auf den das Objekt der atomic_ref nicht mehr enthält |
| Reihenfolge | - | Speicherreihenfolgebeschränkungen, die durchgesetzt werden sollen |
[bearbeiten] Hinweise
Diese Form der Änderungsdetektion ist oft effizienter als einfaches Polling oder reine Spinlocks.
Aufgrund des ABA-Problems können transiente Änderungen von old zu einem anderen Wert und zurück zu old möglicherweise übersehen werden und nicht zu einer Entsperrung führen.
Der Vergleich ist bitweise (ähnlich wie bei std::memcmp); es wird kein Vergleichsoperator verwendet. Auffüllbits, die nie an der Wertrepräsentation eines Objekts teilnehmen, werden ignoriert.
[bearbeiten] Beispiel
| Dieser Abschnitt ist unvollständig Grund: kein Beispiel |
[bearbeiten] Siehe auch
| benachrichtigt mindestens einen Thread, der auf das atomare Objekt wartet (public member function) | |
| benachrichtigt alle Threads, die auf das atomare Objekt warten (public member function) | |
| (C++20) |
benachrichtigt einen Thread, der in atomic_wait blockiert ist (Funktions-Template) |
| (C++20) |
benachrichtigt alle Threads, die in atomic_wait blockiert sind (Funktions-Template) |