Unsere Datenschutzrichtlinie wird in Kürze aktualisiert. Bitte sehen Sie sich die Vorschau an.

C++: Multithreading

Lebenszeit eines Threads

Testen Sie unsere 2016 Kurse

10 Tage kostenlos!

Jetzt testen Alle Abonnements anzeigen
Startet ein Vater-Thread einen weiteren Thread, endet seine Verantwortlichkeit noch nicht. Er muss entweder die Lebenszeit seines Kind-Threads abwarten oder sich von ihm trennen.
04:23

Transkript

In dieser Lektion möchte ich Ihnen die Lebenszeit von Threads genau vorstellen. Ich werde Ihnen vor allem vorstellen, was t.join und t.detach für Auswirkung auf die Lebenszeit eines Threads haben. Aber zuerst zum Anfang. Der Vater oder auch der Erzeuger muss sich explizit um die Lebenszeit seines Kindes kümmern. Was heißt das? Erstens mal, was ist die Lebenszeit seines Kindes? Die Lebenszeit seines Kindes endet genau dann, wenn die aufrufbare Einheit zu Ende ausgeführt wurde, das heißt, wenn die Funktion, das Funktionsobjekt oder auch die Lambda-Funktion ausgeführt wurden. Nun muss sich der Vater um die Lebenszeit seines Kindes kümmern. Er kann es in zwei Arten: er kann t.join aufrufen und er kann t.detach aufrufen. t.join wartet da, bis sein Kind mit seiner Arbeit fertig ist. Durch t.detach trennt er sich von der Lebenszeit seines Kindes. Diese Kinder-Threads werden auch gern Daemon-Threads genannt. Es gibt noch den Begriff, dass ein Thread joinable ist. Ein Thread ist joinable, wenn auf ihm noch nicht t.join oder t.detach aufgerufen wurden. Was ist Ergebnis? Wenn ein joinable Thread gelöscht wird, das heißt, wenn sein Destruktor aufgerufen wird, schmeißt das System eine Ausnahme vom Typ std::terminate. Das Ergebnis ist, dass der Kinder-Thread destruiert wird, und im nächsten Schritt auch der main-Thread, der Hauptthread. Das finale Ergebnis ist: Ihr Programm wird abgebrochen. Das war die Theorie, nun folgt die Praxis. Weiter geht es um diese kleine Anwendung hier. Diese kleine Anwendung starte ich, drei Threads. Der erste Thread führt die Instruktion hier aus, das heißt, die hello-Funktion. Der zweite Thread instanziert im Objekt der Klasse "Hello function object" und in diesem Objekt ist Equal-Operator, dieser hier, überladen. Und was macht der dritte? Der dritte macht es sich ganz einfach: der führt einfach nur 'ne Lambda-Funktion aus, die von hier bis hier. Hier starte ich den Thread t1, hier starte ich den Thread t2, hier starte ich den Thread t3. Auf den Thread t1 wartet mein Erzeuger – der Vater-Thread – durch den Aufruf join. Das Gleiche tut dafür t3, t2 ist besonders, hier trennt er sich von der Lebenszeit seines Kinder-Threads. Ja, und bis jetzt ist eigentlich nichts Spannendes in dem Programm. Jetzt kann ich das Programm ausführen, und Sie sehen, es verhält sich so, wie man erwartet. Die Threads werden in verschiedener Reihenfolge ausgeführt. Diese Reihenfolge ist ähnlich gewährleistet. Ja, und das war nicht zu spannend. Spannender wird schon, wenn ich hier zum Beispiel diesen Aufruf auskommentiere. Was heißt das? Das heißt, dass der Thread t2, dieser hier, joinable ist. Joinable heißt, dass im Destruktor von dem Thread t2 in dem Augenblick, wo er mit seiner Arbeit fertig ist, std::terminate aufgerufen wird, was dazu führt, dass der Thread t2 terminiert wird, was wiederum dazu führt, dass der Main-Thread terminiert wird, was wiederum dazu führt, dass das ganze Programm terminiert. Das heißt, es kommt zum Programmabbruch. Das sehen Sie ganz einfach, wenn ich es jetzt hier mal übersetze. Sie sehen, ich übersetze es hier mal. Ich bin auf meinem Linux-System, also muss ich hier den Standard spezifizieren. Ich spezifiziere in diesem Fall den Standard C++11, und dann muss ich explizit sagen: "Link mir die pthread library hinzu". Ja, jetzt führ ich es aus. Und Sie sehen: genau, was ich versprochen habe – abgebrochen. Das Programm wird abgebrochen, während Destruktor von t2 std::terminate aufgerufen wird. In dieser Lektion habe ich Ihnen die Lebenszeit eines Threads vorgestellt. Insbesondere habe ich Ihnen zwei Aufrufe "t.join" und "t.detach" vorgestellt. Durch t.join wartet der Erzeuger-Thread, bis sein Kinder-Thread fertig ist. Durch t.detach trennt sich der Erzeuger von der Lebenszeit seines Kinder-Threads.

C++: Multithreading

Lernen Sie die High-Level Threading-Schnittstelle in C++ kennenb und nutzen, die Sie in Form von Threads, Tasks, Locks und Bedingungsvariablen zur Anwendung bringen.

2 Std. 40 min (39 Videos)
Derzeit sind keine Feedbacks vorhanden...
 
Software:
Exklusiv für Abo-Kunden
Erscheinungsdatum:16.08.2016

Dieser Online-Kurs ist als Download und als Streaming-Video verfügbar. Die gute Nachricht: Sie müssen sich nicht entscheiden - sobald Sie das Training erwerben, erhalten Sie Zugang zu beiden Optionen!

Der Download ermöglicht Ihnen die Offline-Nutzung des Trainings und bietet die Vorteile einer benutzerfreundlichen Abspielumgebung. Wenn Sie an verschiedenen Computern arbeiten, oder nicht den ganzen Kurs auf einmal herunterladen möchten, loggen Sie sich auf dieser Seite ein, um alle Videos des Trainings als Streaming-Video anzusehen.

Wir hoffen, dass Sie viel Freude und Erfolg mit diesem Video-Training haben werden. Falls Sie irgendwelche Fragen haben, zögern Sie nicht uns zu kontaktieren!