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);