Überall muß um
alles, was auf diese Variablen zugreift, die selbe CriticalSection (oder Ähnliches, z.B. siehe
SyncObjs).
Nur Lesend, wenn währenddessen nirgendwo Schreibend zugegriffen werden kann, da
kann man es auch ohne Synchronisation machen,
aber nur wenn beim Lesezugriff nichts geschrieben wird.
z.B. Stream.Read ist ein schreibender Zugriff, da dort der Posiotionszeiger verändert wird.
Auch Lesend auf eine String-Variable oder Interface-Zeiger zugreifen ist ein schreibender Zugriff,
aber die Referenzzählung ist mit den nachfolgend erwähnten atomaren Operationen gelöst.
Zuweisen/Ändern von Integern/Pointer, da gibt es auch die Möglichkeit von "atomaren" Zugriffen durch die CPU,
siehe
InterlockedAdd und Auslesen geht ohne Extrafunktion (siehe "nur Lesend", da die CPU während des Schreibens alles blockt).
Mehrfach auf den "selben" Wert zugreifen, dann vorher in eine lokale Variable kopieren.
z.B.
if myvar > 0 then MachwasMit(myvar);
nur Windows:
InterlockedIncrement
ansonsten siehe
TInterlocked.Increment bzw. die neuen platformübergreifenden
AtomicIncrement
oder LOCK im Assembler.
https://www.felixcloutier.com/x86/xadd https://stackoverflow.com/questions/...n-x86-assembly