std::atomic_wait, std::atomic_wait_explicit
| Definiert in Header <atomic> |
||
| template< class T > void atomic_wait( const std::atomic<T>* object, |
(1) | (seit C++20) |
| template< class T > void atomic_wait( const volatile std::atomic<T>* object, |
(2) | (seit C++20) |
| template< class T > void atomic_wait_explicit( const std::atomic<T>* object, |
(3) | (seit C++20) |
| template< class T > void atomic_wait_explicit( const volatile std::atomic<T>* object, |
(4) | (seit C++20) |
Führt atomare Wartevorgänge durch. Verhält sich so, als würde es wiederholt die folgenden Schritte ausführen:
- Vergleicht die Wertrepräsentation von object->load() (für Überladungen (1,2)) oder object->load(order) (für Überladungen (3,4)) mit der von old.
- Wenn diese bitweise gleich sind, blockiert es, bis *object durch std::atomic::notify_one() oder std::atomic::notify_all() benachrichtigt wird, oder der Thread fälschlicherweise aufgeweckt wird.
- Andernfalls wird zurückgekehrt.
Diese Funktionen geben nur dann garantiert zurück, wenn sich der Wert geändert hat, auch wenn die zugrundeliegende Implementierung fälschlicherweise aufgeweckt wird.
Inhalt |
[bearbeiten] Parameter
| Objekt | - | Zeiger auf das atomare Objekt, das überprüft und auf das gewartet werden soll |
| old | - | Der Wert, auf den das atomare Objekt nicht mehr gesetzt sein soll |
| Reihenfolge | - | die Speicher-Synchronisationsreihenfolge |
[bearbeiten] Rückgabewert
(keine)
[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
| (C++20) |
blockiert den Thread, bis er benachrichtigt wird und der atomare Wert sich ändert (öffentliche Memberfunktion von std::atomic<T>) |
| (C++20) |
benachrichtigt mindestens einen Thread, der auf das atomare Objekt wartet (öffentliche Memberfunktion von std::atomic<T>) |
| (C++20) |
benachrichtigt alle Threads, die auf das atomare Objekt warten (öffentliche Memberfunktion von std::atomic<T>) |
| (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) |