Kritische Abschnitte

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Gleichzeitigen Zugriff vermeiden


Wenn ein Objekt nicht über integrierte Sperrmechanismen verfügt, kann auf einen so genannten kritischen Abschnitt ausgewichen werden. Kritische Abschnitt arbeiten wie Gates, die jeweils nur einen einzelnen Thread durchlassen. Für den praktischen Einsatz muss eine globale Instanz von System.SyncObjs.TCriticalSection erzeugt werden. TCriticalSection besitzt zwei Methoden: Acquire (verhindert, dass andere Threads den Abschnitt ausführen) und Release (entfernt den Block).

Jeder kritische Abschnitt ist dem globalen Speicher zugeordnet, der geschützt werden soll. Vor dem Zugriff auf diesen globalen Speicher muss der Thread mit der Methode Acquire sicherstellen, dass kein anderer Thread den Speicher verwendet. Nach Ausführung der Operationen ruft der Thread die Methode Release auf, sodass wiederum andere Threads mit einem Aufruf von Acquire auf den globalen Speicher zugreifen können.

Warnung: Kritische Abschnitte erreichen nur dann die vorgesehene Wirkung, wenn sie von jedem Thread für den Zugriff auf den verknüpften globalen Speicher verwendet werden. Sobald es Threads gibt, welche den kritischen Abschnitt ignorieren und ohne Aufruf von Acquire auf den globalen Speicher zugreifen, können sich Kollisionen ergeben.

Angenommen, in einer Anwendung ist zur Realisierung eines kritischen Abschnitts die globale Variable LockXY eingerichtet, welche den Zugriff auf die globalen Variablen X und Y verhindern soll. Jeder Thread, der X oder Y verwendet, muss indirekt vorgehen, also den kritischen Abschnitt z.B. wie folgt aufrufen:

LockXY.Acquire; { lock out other threads }
try
  Y := sin(X);
finally
  LockXY.Release;
end;
pLockXY->Acquire(); // lock out other threads
try {
    Y = sin(X);
}
__finally {
    pLockXY->Release();
}

Siehe auch