Skip to content

Latest commit

 

History

History
117 lines (68 loc) · 3.27 KB

File metadata and controls

117 lines (68 loc) · 3.27 KB

Kooperation von Threads: Klasse std::condition_variable

Zurück


Inhalt


Verwendete Werkzeuge

Mutex-Klassen:

  • Klasse std::mutex
  • Klasse std::condition_variable

Hüllen-Klassen für Mutexobjekte:

  • Klasse std::lock_guard
  • Klasse std::unique_lock

Thread-Klassen:

  • Klasse std::thread

Methoden:

  • Methoden wait, notify_one und notify_all
  • Methode join und detach
  • Methode sleep_for

Quellcode

Condition_Variable_01_Simple.cpp.
Condition_Variable_02_Simple.cpp.


Allgemeines

Concurrency (Nebenläufigkeit, Parallelität) und Synchronization (Synchronisation) sind entscheidende Aspekte der Multithreading-Programmierung.

In C++ stellt die Standardbibliothek mehrere Synchronisierungsprimitive bereit, wie etwa std::mutex, std::lock_guard, std::unique_lock usw., die dazu beitragen, Thread-Sicherheit zu gewährleisten und Data Races zu verhindern, wenn mehrere Threads auf gemeinsam genutzte Ressourcen gleichzeitig zugreifen.

Für das Zusammenspiel von Methoden im Kontext unterschiedlicher Threads gibt es die Klasse std::condition_variable.

Klasse std::condition_variable

Wir gehen auf die Klasse std::condition_variable ein:

Ein std::unique_lock-Objekt muss von der „empfangenden” Seite (der Seite, die benachrichtigt wird) verwendet werden, um bei Gebrauch eines std::condition_variable-Objekts entsprechende Benachrichtigungen empfangen zu können.

Der Grund, warum ein std::unique_lock-Objekt für ein std::condition_variable-Objekt erforderlich ist, besteht darin, dass dieses das zugrunde liegende std::mutex-Objekt jedes Mal sperren kann, wenn die Bedingungsvariable (std::condition_variable) nach einer gültigen Benachrichtigung aus einer Wartephase aufwacht und einen kritischen Codeabschnitt ausführt.

Das std::unique_lock-Objekt entsperrt das zugrunde liegende Mutexobjekt jedes Mal, wenn

  • der Aufruf der wait-Methode an der Bedingungsvariablen fälschlicherweise aktiviert wurde, es also erneut gewartet werden muss.
  • bei automatischer Zerstörung des std::unique_lock-Objekts. Dies ist der Fall, wenn der kritische Abschnitt ausgeführt und schließlich abgelaufen ist und der Gültigkeitsbereich des std::unique_lock-Objekts verlassen wird.

Hinweis

Siehe das Thema

Do I have to acquire lock before calling std::condition_variable.notify_one()?

Und gleich noch ein zweiter Hinweis:

Hinweis

Die Funktionsweise der Methode wait der Klasse std::condition_variable ist wie folgt definiert:

Definition von wait:

template< class Predicate >
void wait(std::unique_lock<std::mutex>& lock, Predicate pred);

Ablauf:

while (!pred()) {
    wait(lock);
}

Das heißt inbesondere, dass vor dem ersten eigentlichen Warten das Prädikat ausgewertet wird!


Zurück