TMultiReadExclusiveWriteSynchronizer-Objekte

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Gleichzeitigen Zugriff vermeiden

Wenn der Schutz des globalen Speichers in einem kritischen Abschnitt implementiert wird, kann immer nur ein Thread auf den geschützten Speicher zugreifen. Ein solcher umfassender Schutz ist aber häufig gar nicht nötig. Ein typisches Beispiel dafür sind Objekte oder Variablen, auf die zwar viele Lesezugriffe durchgeführt werden, denen aber nur sehr selten ein Wert zugewiesen wird. Wenn mehrere Threads gleichzeitig Lesezugriffe auf denselben Speicherbereich ausführen, besteht keine Gefahr eines Konflikts. Kollisionen sind nur möglich, wenn ein Thread einen Schreibzugriff ausführt.

Ein globaler Speicherbereich, auf den zwar verschiedene Threads oft Lesezugriffe ausführen, in den aber nur selten geschrieben wird, kann mit System.SysUtils.TMultiReadExclusiveWriteSynchronizer geschützt werden. Dieses Objekt verhält sich wie ein kritischer Abschnitt, der mehreren Threads das Lesen des geschützten Speichers gestattet, solange kein Thread in diesen Speicher schreibt. In den durch TMultiReadExclusiveWriteSynchronizer geschützten Speicher können nur Threads schreiben, die über einen exklusiven Zugriff verfügen.

Um einen globalen Speicherbereich auf diese Weise zu schützen, erzeugen Sie eine globale Instanz von TMultiReadExclusiveWriteSynchronizer und verknüpfen diese mit dem betreffenden Speicher. Jeder Thread, der aus diesem Speicher lesen will, muss die Methode BeginRead aufrufen. BeginRead stellt sicher, dass kein anderer Thread gerade in diesen Speicher schreibt. Wenn ein Thread den Lesezugriff auf den geschützten Speicher beendet, ruft er die Methode EndRead auf. Wenn ein Thread in den geschützten Speicher schreiben will, muss er vorher die Methode BeginWrite aufrufen. Damit wird sichergestellt, dass kein anderer Thread gerade einen Lese- oder Schreibzugriff auf den Speicher ausführt. Ein Thread beendet seinen Schreibzugriff auf den geschützten Speicher durch einen Aufruf der Methode EndWrite. Erst dann können andere Threads wieder lesend auf den Speicher zugreifen.

Warnung:  Wie ein kritischer Abschnitt, erzielt auch ein TMultiReadExclusiveWriteSynchronizer-Objekt nur dann die gewünschte Wirkung, wenn es von allen Threads zum Zugriff auf den globalen Speicher verwendet wird. Sobald es Threads gibt, die das TMultiReadExclusiveWriteSynchronizer-Objekt ignorieren und ohne einen Aufruf von BeginRead oder BeginWrite auf den globalen Speicher zugreifen, können sich Kollisionen ergeben.

Siehe auch