Forum: Algorithmen, Datenstrukturen und Klassendesign
by himitsu,
7. Jun 2017
Die Lesedinge sperren sich dabei nicht gegenseitig.
Das BeginRead ist nur dafür da, um zu verhindern, dass jemand während des Lesens etwas ändern kann.
BeginRead sperrt das BeginWrite, bzw. hält selber an, wenn gerade geschrieben wird.
Andere BeginRead werden aber durch den Read-Lock (durch BeginRead) nicht beeinflusst.
Forum: Algorithmen, Datenstrukturen und Klassendesign
by himitsu,
7. Jun 2017
Dort, wo lesend auf globale-Klasseninstanz zugegriffen wird, kommt natürlich ein BeginRead drumrum.
Erstmal reicht es den Lese-Zugriff auf diese Variable zu sperren,
aber wenn sich innerhalb dieser Instanz auch etwas ändern kann (Property und enthaltene Variablen), dann auch das mit einschließen.
Wenn sich an der Objektinstanz nicht gleichzeig in mehreren Thread was ändert,
also z.B. da...
Forum: Algorithmen, Datenstrukturen und Klassendesign
by himitsu,
7. Jun 2017
Lesezugriffe sperren sich nicht gegenseitig ... mehrere sind erlaubt.
So lange es Lesesperren gibt, warten alle Schreibanfragen.
Eine Schreibsperre sperrte alle anderen Lese und Schreibzugriffe.
Natürlich nur verwendbar für "echte" Lesezugriffe, wo wirklich nichts geschrieben wird.
z.B. Stream.Read ist zwar ein Lesezugriff, aber da bei wird der Positionszeiger geändert, was einen...
Forum: Algorithmen, Datenstrukturen und Klassendesign
by himitsu,
7. Jun 2017
In Delphi gibt es noch viel mehr Implementationen, die das Gleiche wie eine CriticalSection/TMonitor erledigen.
Dann noch paar Dinger mit Zusatzfunktionen, wie z.B. den TMultiReadExclusiveWriteSynchronizer (TMREWSync), welcher parallele Lesezugriffe erlaubt und nur bei einem Schreibzugriff alles komplett sperrt.
Und für Zugriffe auf einzelne Interger, Pointer, Booleans und anderen Kleinkram...
Forum: Algorithmen, Datenstrukturen und Klassendesign
by himitsu,
7. Jun 2017
Im Prinzip ist TMonitor die umgedrehte Implementation für mehrere TCriticalSection.
Du kannst in ein anderes Object eine CriticalSection rein tun und diese verwenden
TMyObject = class
Lock: TCriticalSecition;
end;
MyObj.Lock.Enter
oder du nutzt das "versteckte" Feld in allen TObject, welches man über TMonitor ansprechen kann.
TMyObject = class