condition_variable-Klasse
Verwenden Sie die condition_variable
-Klasse, um ein Ereignis zu erwarten, wenn Sie über ein mutex
des Typs unique_lock<mutex>
verfügen. Objekte dieses Typs haben möglicherweise eine bessere Leistung als Objekte vom Typ condition_variable_any unique_lock Mutex>>.<<
Syntax
class condition_variable;
Member
Konstruktoren
Name | Beschreibung |
---|---|
condition_variable | Erstellt ein condition_variable -Objekt. |
Functions
Name | Beschreibung |
---|---|
native_handle | Gibt den implementierungsspezifischen Typ zurück, der das Handle "condition_variable" darstellt. |
notify_all | Hebt die Blockierung aller Threads auf, die das condition_variable -Objekt erwarten. |
notify_one | Hebt die Blockierung von einem der Threads, die auf das condition_variable -Objekt warten, auf. |
wait | Blockiert einen Thread. |
wait_for | Blockiert einen Thread und legt ein Zeitintervall fest, nachdem die Blockierung des Threads aufgehoben wird. |
wait_until | Blockiert einen Thread und legt einen maximalen Zeitpunkt fest, an dem die Blockierung des Threads aufgehoben wird. |
condition_variable
Erstellt ein condition_variable
-Objekt.
condition_variable();
Hinweise
Wenn nicht genügend Arbeitsspeicher verfügbar ist, gibt der Konstruktor ein system_error-Objekt mit einem not_enough_memory
-Fehlercode aus. Wenn das Objekt nicht erstellt werden kann, da eine andere Ressource nicht verfügbar ist, wird vom Konstruktor ein system_error
-Objekt mit einem resource_unavailable_try_again
-Fehlercode ausgelöst.
native_handle
Gibt den implementierungsspezifischen Typ zurück, der das „condition_variable“-Handle darstellt.
native_handle_type native_handle();
Rückgabewert
native_handle_type
wird als Zeiger auf interne Datenstrukturen Concurrency Runtime von Concurrency Runtime definiert.
notify_all
Hebt die Blockierung aller Threads auf, die das condition_variable
-Objekt erwarten.
void notify_all() noexcept;
notify_one
Hebt die Blockierung von einem der Threads, die auf das condition_variable
-Objekt warten auf.
void notify_one() noexcept;
wait
Blockiert einen Thread.
void wait(unique_lock<mutex>& Lck);
template <class Predicate>
void wait(unique_lock<mutex>& Lck, Predicate Pred);
Parameter
Lck
Ein unique_lock mutex-Objekt>.<
Pred
Jeder gültige Ausdruck, der true
oder false
zurückgibt.
Hinweise
Die erste Methode sperrt, bis das condition_variable
-Objekt durch einen Aufruf von notify_one oder notify_all signalisiert wurde. Sie kann auch falsch aktiviert werden.
Tatsächlich führt die zweite Methode den folgenden Code aus.
while(!Pred())
wait(Lck);
wait_for
Blockiert einen Thread und legt ein Zeitintervall fest, nachdem die Blockierung des Threads aufgehoben wird.
template <class Rep, class Period>
cv_status wait_for(
unique_lock<mutex>& Lck,
const chrono::duration<Rep, Period>& Rel_time);
template <class Rep, class Period, class Predicate>
bool wait_for(
unique_lock<mutex>& Lck,
const chrono::duration<Rep, Period>& Rel_time,
Predicate Pred);
Parameter
Lck
Ein unique_lock mutex-Objekt>.<
Rel_time
Ein chrono::duration
-Objekt, das die Zeitdauer vor der Aktivierung des Threads angibt.
Pred
Jeder gültige Ausdruck, der true
oder false
zurückgibt.
Rückgabewert
Die erste Methode gibt zurück cv_status::timeout
, wenn die Wartezeit beendet wird, wenn Rel_time verstrichen ist. Andernfalls gibt diese Methode cv_status::no_timeout
zurück.
Die zweite Methode gibt den Wert von Pred zurück.
Hinweise
Die erste Methode blockiert, bis das condition_variable
Objekt durch einen Aufruf von notify_one oder notify_all oder bis zum Verstrichen des Zeitintervalls Rel_time signalisiert wird. Sie kann auch falsch aktiviert werden.
Tatsächlich führt die zweite Methode den folgenden Code aus.
while(!Pred())
if(wait_for(Lck, Rel_time) == cv_status::timeout)
return Pred();
return true;
wait_until
Blockiert einen Thread und legt einen maximalen Zeitpunkt fest, an dem die Blockierung des Threads aufgehoben wird.
template <class Clock, class Duration>
cv_status wait_until(
unique_lock<mutex>& Lck,
const chrono::time_point<Clock, Duration>& Abs_time);
template <class Clock, class Duration, class Predicate>
bool wait_until(
unique_lock<mutex>& Lck,
const chrono::time_point<Clock, Duration>& Abs_time,
Predicate Pred);
cv_status wait_until(
unique_lock<mutex>& Lck,
const xtime* Abs_time);
template <class Predicate>
bool wait_until(
unique_lock<mutex>& Lck,
const xtime* Abs_time,
Predicate Pred);
Parameter
Lck
Ein unique_lock mutex-Objekt>.<
Abs_time
Ein chrono::time_point-Objekt
Pred
Jeder gültige Ausdruck, der true
oder false
zurückgibt.
Rückgabewert
Methoden, die einen cv_status
Typ zurückgeben cv_status::timeout
, wenn die Wartezeit beendet wird, wenn Abs_time verstrichen ist. Andernfalls geben diese Methoden cv_status::no_timeout
zurück.
Methoden, die einen bool
Rückgabewert von Pred zurückgeben.
Hinweise
Die erste Methode blockiert, bis das condition_variable
-Objekt durch einen Aufruf von notify_one oder notify_all signalisiert wurde, oder bis Abs_time
. Sie kann auch falsch aktiviert werden.
Tatsächlich führt die zweite Methode den folgenden Code aus.
while(!Pred())
if(wait_until(Lck, Abs_time) == cv_status::timeout)
return Pred();
return true;
Bei der dritten und vierten Methode wird einen Zeiger auf ein Objekt des Typs xtime
, verwendet, um das chrono::time_point
-Objekt zu ersetzen. Mit dem xtime
-Objekt wird die maximale Zeit angegeben, die auf ein Signal gewartet wird.