std::condition_variable_any:: wait
|
template
<
class
Lock
>
void wait ( Lock & lock ) ; |
(1) | (seit C++11) |
|
template
<
class
Lock,
class
Predicate
>
void wait ( Lock & lock, Predicate pred ) ; |
(2) | (seit C++11) |
|
template
<
class
Lock,
class
Predicate
>
bool wait ( Lock & lock, std:: stop_token stoken, Predicate pred ) ; |
(3) | (seit C++20) |
wait
bewirkt, dass der aktuelle Thread blockiert, bis die Bedingungsvariable benachrichtigt wird oder ein spontanes Aufwachen auftritt.
pred
kann optional bereitgestellt werden, um spontanes Aufwachen zu erkennen.
wait ( lock ) ;
{
if ( pred ( ) )
return true ;
wait ( lock ) ;
}
return pred ( ) ;
Unmittelbar nachdem
wait
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 |
| 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
Der Rückgabewert der Überladung (3) gibt an, ob pred zu true ausgewertet wurde, unabhängig davon, ob ein Stop angefordert wurde oder nicht.
Die Auswirkungen von
notify_one()
/
notify_all()
und jeder der drei atomaren Bestandteile von
wait()
/
wait_for()
/
wait_until()
(Entsperren+Warten, Aufwecken und Sperren) erfolgen in einer einzigen Gesamtreihenfolge, die als
Modifikationsreihenfolge
einer atomaren Variable betrachtet werden kann: Die Reihenfolge ist spezifisch für diese individuelle Condition Variable. Dies macht es unmöglich, dass
notify_one()
beispielsweise verzögert wird und einen Thread entsperrt, der erst 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 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, falls lock. lock ( ) eine Exception wirft | ruft std::terminate in diesem Fall auf |
Siehe auch
|
blockiert den aktuellen Thread, bis die Condition Variable aufgeweckt wird oder nach Ablauf der angegebenen Timeout-Dauer
(public member function) |
|
|
blockiert den aktuellen Thread, bis die Condition Variable aufgeweckt wird oder der angegebene Zeitpunkt erreicht wurde
(public member function) |
|
|
C documentation
für
cnd_wait
|
|
Externe Links
| The Old New Thing Artikel: Falsche Aufweckvorgänge in Win32-Bedingungsvariablen. |