Was sind Threads?
Der Ablauf der tatsächlichen Codeausführung innerhalb eines Prozesses
Die in diesem Blog verfassten Artikel wurden mit dem Ziel erstellt, zu unterrichten. Außerdem können die Informationen im Artikel falsch sein, also seien Sie bitte vorsichtig.
Wenn ein Prozess ein Container ist, der Ressourcen wie Speicher und Dateien enthält, ist ein Thread der Fluss, der darin tatsächlich Befehle ausführt.
Beim Erstellen eines Prozesses wird normalerweise ein Hauptthread gestartet, bei Bedarf können weitere Threads erstellt werden.
Threads im selben Prozess teilen sich Ressourcen
Threads, die zum selben Prozess gehören, teilen sich Code, globale Daten, Heap und geöffnete Dateien. Stattdessen hat jeder Thread seinen eigenen Stapel, Registerstatus und Ausführungsort.
ein Prozess
┌──────────────────────────┐
│ Code-/Daten-/Heap-Freigabe │
├────────────┬─────────────┤
│ Thread A │ Thread B │
│ Stack A │ Stack B │
│ Register A │ Register B │
└────────────┴─────────────┘
Der Grund dafür, dass zwei Threads die Adresse desselben Objekts verwenden können, liegt darin, dass sie den Heap gemeinsam nutzen. Andererseits werden lokale Variablen von Funktionen grundsätzlich auf dem Stapel jedes Threads erstellt, sodass sie voneinander getrennt sind.
Warum Threads verwenden?
In einem Spiel kann beispielsweise ein Arbeitsthread die Pfadnavigation oder das Laden von Ressourcen durchführen, während der Hauptthread Eingaben und Bildschirmaktualisierungen übernimmt. Wenn Sie über mehrere CPU-Kerne verfügen, können tatsächlich verschiedene Threads gleichzeitig ausgeführt werden.
std::thread worker([]()
{
LoadResources();
});
UpdateGame();
worker.join();
join()bewirkt, dass der aktuelle Thread wartet, bis der Arbeitsthread beendet ist.
Unterschied zwischen Prozess und Thread
Prozesse sind grundsätzlich im Speicher isoliert, sodass sich Probleme in einem Prozess nur schwer direkt auf andere Prozesse ausbreiten können. Allerdings sind die Erzeugungs- und Kommunikationskosten relativ hoch.
Da Threads denselben Speicher teilen, ist der Datenaustausch einfach und relativ leichtgewichtig. Stattdessen können falscher Zeigerzugriff oder Synchronisierungsfehler den gesamten Prozess zerstören.
Prozess: Einheit von Ressourceneigentum und -isolation
Thread: Von der CPU ausgeführte Flusseinheit
Mehr Threads zu haben, macht die Dinge nicht unbedingt schneller. Wenn die Kosten für das Aufteilen von Aufgaben, das Warten auf Sperren, Cache-Konflikte und den Kontextwechsel den Rechenvorteil übersteigen, kann es tatsächlich zu einer Verlangsamung kommen.