Home » Tutorials » Object Pascal/RTL » Parallelisierung mit Delphis Parallel Library

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“

  1. In der Routine

      ...
      TParallel.For(1, 100000, procedure(I: Integer)
      Begin
        If IsPrime(i) Then
          inc(Total);
      End);
      ...

    würde ich statt inc(Total) die Anweisung TInterlocked.Increment(Total) verwenden, sonst stimmt die Anzahl der ermittelten Primzahlen nicht.

Kommentare sind geschlossen.