Home » Tutorials » Object Pascal/RTL » Threads

Threads

Synchronisierung

Beim synchronisierten Multithreading gelten folgende Regeln:

  • Nur ein Thread darf zur gleichen Zeit die Daten verändern.
  • Während ein Thread die Daten verändert, darf kein zweiter Thread die Daten lesen.
  • Während ein Thread die Daten liest, darf kein zweiter Thread die Daten verändern.
  • Während ein Thread die Daten liest, dürfen alle anderen Threads auch die Daten lesen.

Deadlock

Beim Synchronisieren von Threads muss darauf geachtet werden, dass keine sog. Deadlock-Situation entsteht. Dabei handelt es sich um eine Verklemmung, die z.B. auftritt, wenn zwei Threads beide auf ein Signal des anderen warten. Es handelt sich also um ein Vergehen wie eine Endlosschleife, das unbedingt vermieden werden sollte.

Kritischer Abschnitt (Critical Section)

Bei einem kritischen Abschnitt handelt es sich um ein Stück im Programmablauf, das immer nur von einem einzigen Thread gleichzeitig abgearbeitet werden darf. Für alle anderen Threads ist dieser Abschnitt gesperrt. Betritt ein Thread diesen kritischen Abschnitt, aktiviert er die Sperrung, so dass der Wechsel zu einem anderen Thread des gleichen Prozesses verhindert wird. Wenn er den Abschnitt verlassen hat, muss er die Sperrung wieder aufheben, da ansonsten eine Deadlock-Situation entsteht. Es ist klar, dass kritische Abschnitte immer so kurz wie möglich gehalten werden sollten. Zum Einsatz kommt diese Technik an Stellen, an denen z.B. globale Variablen verändert werden. Hierbei muss sichergestellt werden, dass diese Daten nicht gleichzeitig von einem anderen Thread ausgelesen oder verändert werden. Delphi stellt dafür die Klasse TCriticalSection (Unit SyncObjs) bereit, auf die später eingegangen wird.

Event

Mit TEvent (Unit SyncObjs) lässt sich signalisieren, dass ein Ereignis aufgetreten ist oder ein bestimmter Status erreicht wurde. In einer Multithread-Anwendung kann TEvent verwendet werden, damit ein Thread anderen Threads signalisieren kann, dass ein Ereignis ausgelöst wurde.

TMultiReadExclusiveWriteSynchronizer

Während beim kritischen Abschnitt ein Bereich komplett für andere Threads gesperrt ist, arbeitet dieses Objekt (Unit SysUtils) – wie der Name bereits sagt – differenzierter. Nur das Schreiben wird auf einen Thread begrenzt. Das Lesen ist weiterhin allen Threads möglich.