Deadlock und Race Condition

Teil 3: Programmieren für die Multi-Core-CPU

Der CLR-Thread Pool

Das Erzeugen (etwa 200000 cycles) und Löschen (etwa 100000 cycles) von Threads ist ein vergleichsweise zeitaufwändiger Vorgang. Für kurz laufende Prozesse würde der Verwaltungs-Overhead übermäßig zu Buche schlagen und den Gewinn durch die Parallelisierung zunichte machen.

Daher versucht man, möglichst selten Threads zu erzeugen oder zu löschen. Hierzu verwaltet die CLR intern einen Pool an so genannten Worker Threads. Der Entwickler interagiert mit diesem Pool. Er übergibt seine Threads an diesen Pool zur Verwaltung. Dazu steht ihm der Klassentyp ThreadPool aus dem Namensraum System.Threading zur Verfügung. Dieser Thread Pool kann er verwenden, um beispielsweise Arbeitsaufträge, Timer oder asynchrone I/O-Operationen zu hinterlegen und kontrolliert durch .Net ausführen zu lassen. Um eine Methode unter der Kontrolle des Frameworks ausführen zu lassen, übergibt der Entwickler die Methode an den Pool. Dazu steht ihm die Methode ThreadPool.QueueUserWorkItem() zur Verfügung. Die übergebene Methode wird ausgeführt, sobald ein Thread im Pool verfügbar ist.

Durch das Überladen (overloading) der Methode mit einer anwendungsspezifischen Methode und dem System.Object erfolgt der Verweis auf den Anwendungs-Code.

public static bool QueueUserWorkItem(WaitCallback callBack);

public static bool QueueUserWorkItem(WaitCallback callBack, object state);