Multithreading: Einführung

Beim Multithreading werden mehrere sogenannte Threads (auch Ausführungsstrang genannt) innerhalb eines einzelnen Tasks (auch Prozess genannt) gleichzeitig abgearbeitet. Dieses Verfahren ist nur bei Mehrkernprozessoren möglich.
Doch trotzdem scheint es so, dass selbst bei Einkernprozessoren verschiedene Aufgaben quasi gleichzeitig erledigt werden. Dies kommt daher, dass die einzelnen Prozesse nur eine bestimmte Zeit laufen dürfen. Läuft diese Zeit ab, so wird der nächste Prozess ausgeführt. Dieser Vorgang läuft im Kreis weiter, wodurch es auch kein Problem ist, wenn ein Prozess beendet wird bzw. ein neuer hinzukommt. Da die Zeiten wie lange ein Prozess laufen darf extrem klein sind, entsteht das Bild, als würden die Aufgaben gleichzeitig ausgeführt werden. Bei diesem Verfahren spricht man von Multitasking.
Das Multithreading-Verfahren ist wie bereits oben angesprochen nur möglich, wenn mehrere Prozessorkerne vorhanden sind. Diese Regel gilt jedoch nur für das hardwareseitige Multithreading. Beim softwareseitigen Multithreading genügt es, wenn nur ein Prozessorkern vorhanden ist, da hier die Aufteilung der Threads softwareseitig passiert. Da jedoch nur ein Prozesskern vorhanden ist, ist eine echtes gleichzeitiges abarbeiten nicht mehr möglich. Das softwareseitige Multithreading ist also von der Arbeitsweise vergleichbar mit dem Multitasking. Der Unterschied kann wie folgt erklärt werden: Beim Multithreading werden Threads aufgeteilt, wohingegen beim Multitasking Tasks (vereinfacht gesagt also mehrere Programme) aufgeteilt werden. Der Vorteil bei der Aufteilung von Threads ist, dass sich die Threads innerhalb eines Tasks befinden und somit eine Kommunikation zwischen den Threads möglich ist.
In C# ist es möglich, Threads zu erstellen, dadurch können wir also unseren Prozess unterteilen. In Windows-Forms-Anwendungen wird hier gerne die Klasse BackgroundWorker verwendet, auf welchen wir später genauer eingehen werden. In diesem Kapitel wollen wir uns mit der Klasse Thread und dem Delegat ThreadStart sowie dem Delegat AsynCallback und dem Interface IAsynResult beschäftigen.

LinksRechts