Parallelisierung mit Delphis Parallel Library
Threadpools
Threadpools werden benötigt, um Threads zu verwalten. Sie managen, wie viele parallele Threads es geben kann und wie viele angesichts der vorhandenen CPUs überhaupt sinnvoll sind. Die Anwendung holt sich bei Bedarf einen Thread aus dem Pool und gibt ihn nach Abschluss wieder dorthin zurück. Sind alle Threads aus dem Threadpool in Benutzung und das Maximum erreicht, müssen alle, die einen neuen Thread benötigen, warten, bis wieder einer frei wird. Werden eine Zeitlang keine neuen Threads benötigt, kann der Threadpool sie bis auf ein eingestelltes Minimum wieder freigeben.
Das Ganze kann recht komplex werden, weshalb man im Normalfall Delphis Default-Threadpool diese Aufgabe überlassen sollte. Die Implementierung in der Parallel Library weiß genau, wie viele CPU-Kerne vorhanden sind, wie viele Threads pro Kern sinnvoll sind, und wie sie sich verhalten muss, um die Prozessoren nicht zu überlasten und damit den ganzen Rechner lahmzulegen.
Dahinter steckt die Klasse System.Threading.TThreadPool. In ihr sind als Konstante 25 Threads pro CPU (MaxThreadsPerCPU) definiert. Die Anzahl der CPUs wird zur Laufzeit ermittelt und steht unter TThread.ProcessorCount zur Verfügung. Wer sich für die maximale Poolgröße interessiert, kann den Threadpool zur Laufzeit befragen:
var maxThreads : integer; Begin maxThreads := TThreadPool.Default.MaxWorkerThreads; ShowMessage('Pool size = ' + maxThreads.ToString()); End;
Benutzerdefinierter Threadpool
Natürlich ist es auch möglich, seinen eigenen Threadpool zu definieren. Dazu wird der Konstruktor von TThreadPool aufgerufen und anschließend über verschiedene Set-Methoden die Konfiguration gesetzt.
Bei Verwendung der parallelen For-Schleife ist es dann möglich, die Referenz auf den eigenen Threadpool als weiteren Parameter zu setzen. Von TParallel.For existieren eine ganze Liste an überladenen Varianten. Einige von diesen haben einen TThreadPool als Parameter. Alle anderen verwenden den oben erwähnten Default-Threadpool.
Ein eigener Threadpool sollte nur in speziellen Fällen verwendet werden. Normalerweise reicht der Default aus. Außerdem ist zu beachten, dass das Erzeugen eines neuen Threadpools die Performance beeinträchtigt. Das sollte also am besten nur einmal pro Anwendung passieren.
Download Beispiel-Anwendung (Threadpool-Infos, ZIP, 5 KB)
Ein Gedanke zu „Parallelisierung mit Delphis Parallel Library“
Kommentare sind geschlossen.
In der Routine