std::condition_variable_any:: wait_for
|
template
<
class
Lock,
class
Rep,
class
Period
>
std::
cv_status
wait_for
(
Lock
&
lock,
|
(1) | (seit C++11) |
|
template
<
class
Lock,
class
Rep,
class
Period,
class
Predicate
>
bool
wait_for
(
Lock
&
lock,
const
std::
chrono
::
duration
<
Rep, Period
>
&
rel_time,
|
(2) | (seit C++11) |
|
template
<
class
Lock,
class
Rep,
class
Period,
class
Predicate
>
bool
wait_for
(
Lock
&
lock,
std::
stop_token
stoken,
|
(3) | (seit C++20) |
wait_for
bewirkt, dass der aktuelle Thread blockiert, bis die Bedingungsvariable benachrichtigt wird, die angegebene Dauer abgelaufen ist oder ein spontanes Aufwachen auftritt.
pred
kann optional bereitgestellt werden, um spontanes Aufwachen zu erkennen.
std:: chrono :: steady_clock :: now ( ) + rel_time, std :: move ( pred ) ) ; .
Unmittelbar nachdem
wait_for
zurückkehrt, ist
lock
durch den aufrufenden Thread gesperrt. Wenn diese Nachbedingung nicht erfüllt werden kann
[1]
, ruft es
std::terminate
auf.
- ↑ Dies kann passieren, wenn das erneute Sperren des Mutex eine Exception auslöst.
Inhaltsverzeichnis |
Parameter
| lock | - | eine Sperre, die vom aufrufenden Thread gesperrt werden muss |
| stoken | - | ein Stop-Token zur Registrierung von Unterbrechungen |
| rel_time | - | die maximale Wartezeit |
| pred | - | das Prädikat zur Überprüfung, ob das Warten abgeschlossen werden kann |
| Typanforderungen | ||
-
Lock
muss die Anforderungen von
BasicLockable
erfüllen.
|
||
-
Predicate
muss die Anforderungen von
FunctionObject
erfüllen.
|
||
|
-
|
||
Rückgabewert
Ausnahmen
Hinweise
Selbst wenn unter Sperre benachrichtigt, gibt Overload (1) keine Garantien über den Zustand des assoziierten Prädikats bei Rückkehr aufgrund von Timeout.
Die Effekte von
notify_one()
/
notify_all()
und jeder der drei atomaren Teile von
wait()
/
wait_for()
/
wait_until()
(Entsperren+Warten, Aufwecken und Sperren) finden in einer einzigen Gesamtordnung statt, die als
Modifikationsreihenfolge
einer atomaren Variable betrachtet werden kann: Die Reihenfolge ist spezifisch für diese individuelle Bedingungsvariable. Dies macht es unmöglich, dass
notify_one()
beispielsweise verzögert wird und einen Thread entsperrt, der gerade nach dem Aufruf von
notify_one()
mit dem Warten begonnen hat.
Beispiel
#include <chrono> #include <condition_variable> #include <iostream> #include <thread> std::condition_variable_any cv; std::mutex cv_m; // Dieses Mutex wird für drei Zwecke verwendet: // 1) zum Synchronisieren von Zugriffen auf i // 2) zum Synchronisieren von Zugriffen auf std::cerr // 3) für die Condition Variable cv int i = 0; void waits() { std::unique_lock<std::mutex> lk(cv_m); std::cerr << "Waiting... \n"; cv.wait(lk, []{ return i == 1; }); std::cerr << "...finished waiting. i == 1\n"; } void signals() { std::this_thread::sleep_for(std::chrono::seconds(1)); { std::lock_guard<std::mutex> lk(cv_m); std::cerr << "Notifying...\n"; } cv.notify_all(); std::this_thread::sleep_for(std::chrono::seconds(1)); { std::lock_guard<std::mutex> lk(cv_m); i = 1; std::cerr << "Notifying again...\n"; } cv.notify_all(); } int main() { std::thread t1(waits), t2(waits), t3(waits), t4(signals); t1.join(); t2.join(); t3.join(); t4.join(); }
Mögliche Ausgabe:
Waiting... Waiting... Waiting... Notifying... Notifying again... ...finished waiting. i == 1 ...finished waiting. i == 1 ...finished waiting. i == 1
Fehlerberichte
Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | Angewendet auf | Verhalten wie veröffentlicht | Korrektes Verhalten |
|---|---|---|---|
| LWG 2093 | C++11 | Timeout-bezogene Ausnahmen fehlten in der Spezifikation | erwähnt diese Ausnahmen |
|
LWG 2114
( P2167R3 ) |
C++11 | Konvertierbarkeit zu bool war zu schwach, um die Erwartungen der Implementierungen widerzuspiegeln | Anforderungen verstärkt |
| LWG 2135 | C++11 | das Verhalten war unklar, wenn lock. lock ( ) eine Ausnahme wirft | ruft std::terminate in diesem Fall auf |
Siehe auch
|
blockiert den aktuellen Thread, bis die Bedingungsvariable aufgeweckt wird
(öffentliche Elementfunktion) |
|
|
blockiert den aktuellen Thread, bis die Bedingungsvariable aufgeweckt wird oder der angegebene Zeitpunkt erreicht wurde
(öffentliche Elementfunktion) |