C++ Core Guidelines: Bedingungsvariablen nur mit Prüfung verwenden

Rainer Grimm beschreibt in einem Beitrag zu den C++ Core Guidelines die Risiken von Bedingungsvariablen. Die am 4. Juni 2018 veröffentlichte Folge konzentriert sich auf Regel CP.42: Eine Anwendung soll nicht ohne Prüfung einer Bedingung warten.

Eine condition_variable synchronisiert Threads, die auf eine Zustandsänderung warten. Der Aufruf kann jedoch auch ohne die erwartete Änderung zurückkehren. Die offizielle Fassung der C++ Core Guidelines verlangt deshalb eine Bedingung, die den gemeinsamen Zustand nach dem Aufwachen erneut prüft.

Prädikat schützt vor falschem Aufwachen

In der Praxis wird die Bedingungsvariable mit einem Prädikat verwendet. Der wartende Thread kehrt erst aus wait zurück, wenn das Prädikat erfüllt ist. So bleibt die Entscheidung an den Daten ausgerichtet, die zwischen den Threads geschützt ausgetauscht werden.

Ohne diese Prüfung kann ein Thread weiterlaufen, obwohl ein Auftrag, ein Datenpaket oder ein anderer gemeinsamer Zustand noch nicht bereitsteht. In Engine-, Netzwerk- und Build-Code erschwert ein solcher Fehler die Reproduktion, weil das Timing zwischen den Threads die Symptome beeinflusst.

Die Folge ergänzt die frühere Betrachtung von switch-Anweisungen und Dispatch-Tabellen. Beide Themen zeigen, wie die Guidelines konkrete Prüfstellen für große C++-Codebasen formulieren.

Weitere News

Weitere News

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein