std::atomic_flag::wait
Von cppreference.com
< cpp | atomic | atomic flag
void wait( bool old, std::memory_order order = std::memory_order_seq_cst ) const noexcept; |
(1) | (seit C++20) (constexpr seit C++26) |
| void wait( bool old, std::memory_order order = |
(2) | (seit C++20) |
Führt atomare Wartevorgänge durch. Verhält sich so, als würde es wiederholt die folgenden Schritte ausführen:
- Vergleiche this->test(order) mit 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, der nicht mehr im `atomic_flag`-Objekt enthalten ist, zum Überprüfen |
| 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.
[bearbeiten] Beispiel
| Dieser Abschnitt ist unvollständig Grund: kein Beispiel |
[bearbeiten] Siehe auch
| (C++20) |
benachrichtigt mindestens einen Thread, der auf das atomare Objekt wartet (public member function) |
| (C++20) |
benachrichtigt alle Threads, die auf das atomare Objekt warten (public member function) |
| (C++20) |
benachrichtigt einen Thread, der in atomic_flag_wait blockiert ist (Funktion) |
| (C++20) |
benachrichtigt alle Threads, die in atomic_flag_wait blockiert sind (Funktion) |