Forum: Algorithmen, Datenstrukturen und Klassendesign
by jaenicke,
8. Jun 2017
Ich glaube ich hole besser noch einmal weiter aus bevor ich das beantworte.
Du musst vor jedem Schreibvorgang BeginWrite aufrufen (ab da werden alle Schreib- und Lesezugriffe blockiert) und nach dessen Abschluss EndWrite (dann können wieder alle lesen).
Vor jedem Lesevorgang musst du BeginRead aufrufen (ab da wartet BeginWrite, falls es danach aufgerufen wird, auf den Abschluss des...
Forum: Algorithmen, Datenstrukturen und Klassendesign
by jaenicke,
7. Jun 2017
Entweder du kannst sicherstellen, dass bei dem Schreibvorgang ohnehin niemand liest, dann brauchst du keinerlei Sperren (sofern beim Lesen alles threadsicher ist).
Oder du kannst nicht ausschließen, dass jemand liest während du schreibst, dann musst du dies durch Sperren sicherstellen, in dem Fall durch den TMultiReadExclusiveWriteSynchronizer. Dann musst du dem aber auch sagen wann du lesen...
Forum: Algorithmen, Datenstrukturen und Klassendesign
by jaenicke,
11. Mai 2017
Das passt in den meisten Fällen schon. Nur, wenn die Performance wirklich ein Problem ist, sollte man untersuchen, ob man damit etwas verbessern kann. Aber im Normalfall sollte man den SpinCount lassen wie er ist und TMonitor einfach verwenden.
Forum: Algorithmen, Datenstrukturen und Klassendesign
by jaenicke,
5. Mai 2017
In deinem Link steht doch genau die Antwort auf die Berichte über die schlechte Performance. Seit XE5 ist das behoben und schneller als eine CS.
Hier auch nochmal der Link:
https://community.embarcadero.com/blogs/entry/monitoring-the-monitor-38952
Forum: Algorithmen, Datenstrukturen und Klassendesign
by jaenicke,
5. Mai 2017
Viel einfacher:
TMonitor.Enter(ClipBoard);
try
...
finally
TMonitor.Exit(ClipBoard);
end;
Schneller als eine Critical Section, genau auf das Objekt bezogen und ohne zusätzliche Initialisierung usw.