Namensräume
Varianten
Aktionen

std::atomic_wait, std::atomic_wait_explicit

Von cppreference.com
< cpp‎ | atomic
 
 
Bibliothek für nebenläufige Programmierung
Threads
(C++11)
(C++20)
this_thread Namespace
(C++11)
(C++11)
(C++11)
Kooperatives Beenden
Gegenseitiger Ausschluss
(C++11)
Allgemeines Sperrungsmanagement
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
Bedingungsvariablen
(C++11)
Semaphoren
Latches und Barriers
(C++20)
(C++20)
Futures
(C++11)
(C++11)
(C++11)
(C++11)
Sichere Wiederherstellung
(C++26)
Hazard Pointer
Atomare Typen
(C++11)
(C++20)
Initialisierung von atomaren Typen
(C++11)(veraltet in C++20)
(C++11)(veraltet in C++20)
Speicherordnung
(C++11)(deprecated in C++26)
Freie Funktionen für atomare Operationen
atomic_waitatomic_wait_explicit
(C++20)(C++20)
Freie Funktionen für atomare Flags
 
Definiert in Header <atomic>
template< class T >

void atomic_wait( const std::atomic<T>* object,

                  typename std::atomic<T>::value_type old );
(1) (seit C++20)
template< class T >

void atomic_wait( const volatile std::atomic<T>* object,

                  typename std::atomic<T>::value_type old );
(2) (seit 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 );
(3) (seit C++20)
template< class T >

void atomic_wait_explicit( const volatile std::atomic<T>* object,
                           typename std::atomic<T>::value_type old,

                           std::memory_order order );
(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.

1,2) Äquivalent zu object->wait(old).
3,4) Äquivalent zu object->wait(old, order).
Wenn order einer der Werte std::memory_order::release und std::memory_order::acq_rel ist, ist das Verhalten undefiniert.

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

[bearbeiten] Siehe auch

(C++20)
blockiert den Thread, bis er benachrichtigt wird und der atomare Wert sich ändert
(öffentliche Memberfunktion von std::atomic<T>) [bearbeiten]
benachrichtigt mindestens einen Thread, der auf das atomare Objekt wartet
(öffentliche Memberfunktion von std::atomic<T>) [bearbeiten]
benachrichtigt alle Threads, die auf das atomare Objekt warten
(öffentliche Memberfunktion von std::atomic<T>) [bearbeiten]
benachrichtigt einen Thread, der in atomic_wait blockiert ist
(Funktions-Template) [bearbeiten]
benachrichtigt alle Threads, die in atomic_wait blockiert sind
(Funktions-Template) [bearbeiten]