System.SyncObjs.TLightweightMREW

Aus RAD Studio API Documentation
Wechseln zu: Navigation, Suche

Delphi

TLightweightMREW = record

C++

struct DECLSPEC_DRECORD TLightweightMREW
{
private:
    _RTL_SRWLOCK FNativeRW;
public:
    TLightweightMREW() { _op_Initialize(*this); }
        static void __fastcall _op_Initialize(/* out */ TLightweightMREW &Dest);
    void __fastcall BeginRead();
    bool __fastcall TryBeginRead();
    void __fastcall EndRead();
    void __fastcall BeginWrite();
    bool __fastcall TryBeginWrite();
    void __fastcall EndWrite();
};

Eigenschaften

Typ Sichtbarkeit Quelle Unit Übergeordnet
record
struct
public
System.SyncObjs.pas
System.SyncObjs.hpp
System.SyncObjs System.SyncObjs


TLightweightMREW Record

TLightweightMREW ist eine Lese-/Schreibsperren-Implementierung, die in RAD Studio 10.4.1 eingeführt wurde und auf allen unterstützten Plattformen eingesetzt werden kann, um eine schnellere und weniger ressourcenintensive Synchronisierung als der vorhandene TMultiReadExclusiveWriteSynchronizer zu ermöglichen.

Dieser Synchronisierer ist als verwalteter Record implementiert (nicht als Klasse, damit er nicht aus dem Arbeitsspeicher freigegeben werden muss). Er hat geringere Speicheranforderungen und ist im Allgemeinen schneller, da er native POSIX-APIs kapselt.

TLightweightMREW ist viel schneller als der TMultiReadExclusiveWriteSynchronizer und implementiert auf allen Plattformen einen Lese-/Schreibsperren-Mechanismus. Der TMultiReadExclusiveWriteSynchronizer dagegen ist als kritischer Abschnitt auf Nicht-Windows-Plattformen implementiert. Daher ist TLightweightMREW in den meisten Fällen ein besserer Ersatz für den klassischen TMultiReadExclusiveWriteSynchronizer.

Zugriffsmodi von TLightweightMREW

TLightweightMREW kapselt eine native Implementierung einer Lese-/Schreibsperre (auch als MRSW-Sperre oder MREW-Sperre bezeichnet). Dieser Mechanismus lässt zwei verschiedene Zugriffsmodi zu: geteilter Lesezugriff und exklusiver Schreibzugriff.

Geteilter Zugriff

  • Beim geteilten Zugriff können mehrere Lesemethoden gleichzeitig auf die Ressource zugreifen, während zudem verhindert wird, dass ein Thread einen exklusiven (Schreib-)Zugriff erhält.
  • Der geteilte Zugriff kann rekursiv angefordert werden. Ein einzelner Thread kann mehrmals hintereinander Zugriff erhalten. Jeder BeginRead/TryBeginRead-Aufruf muss mit einem Aufruf von EndRead gepaart sein.

Exklusiver Zugriff

  • Der exklusive (Schreib-)Zugriff kann nur jeweils einem Thread gleichzeitig gewährt werden. Wenn sich eine TLighweightMREW-Sperre im exklusiven Modus befindet, wird verhindert, dass ein Thread geteilten (Lese-)Zugriff erhält.
  • Der exklusive Zugriff kann nicht rekursiv angefordert werden.
  • Ein geteilter Zugriff kann nicht in einen exklusiven Zugriff geändert werden.

Verwenden von TLightweightMREW auf unterstützten Plattformen

Die TLightweightMREW-Implementierung ist zwar vom Betriebssystem abhängig, aber derartige Sperrfunktionen sind auf allen unterstützten Plattformen fast identisch.

Die folgenden Fakten gelten für alle Implementierungen:

  • Wenn ein Thread eine Lesesperre hält, kann jeder andere Thread auch eine Lesesperre erhalten, während kein anderer Thread eine Schreibsperre erhalten kann.
  • Wenn ein Thread eine Schreibsperre hält, kann kein anderer Thread eine Lese- oder Schreibsperre erhalten.
  • Wenn ein Thread eine Lesesperre hält, kann er eine weitere Lesesperre erhalten, bevor er die erste freigibt (Rekursion).
  • Wenn ein Thread eine Schreibsperre hält, kann er keine weitere Schreibsperre erhalten.

Das folgende Verhalten hängt vom Betriebssystem ab:

  • Wenn mindestens eine Lesemethode immer aktiv ist, kann eine Schreibmethode niemals die Sperre übernehmen (Verhungern).
  • Wenn derselbe Thread versucht, eine Schreibsperre zweimal rekursiv zu erhalten, führt dies unter Windows zu einem Deadlock der Anwendung, auf POSIX-Systemen wir dagegen eine Exception ausgelöst.