![]() |
Delphi-Version: 10 Seattle
TMonitor vs. TMultiReadExclusiveWriteSynchronizer
Hallo zusammen,
anstelle einer TCriticalSection verwende ich schon immer TMonitor, da TMonitor von der Performance her ganz gut sein soll und auch schöner einzusetzen ist. Jetzt habe ich aber öfter den Fall, dass ich nur wenige Male die Ressource schreiben muss aber sehr oft lesen muss. Hierzu verwende ich gerne TMultiReadExclusiveWriteSynchronizer. Was haltet ihr davon oder würdet ihr hierfür auch TMonitor verwenden oder ganz eine andere Lösung? Ich weiß nicht wie sich TMultiReadExclusiveWriteSynchronizer aus Performance-Sicht schlägt. Jemand Erfahrung? |
AW: TMonitor vs. TMultiReadExclusiveWriteSynchronizer
Praktische Performancewerte kann ich auch nicht vorweisen. Allerdings wird durch die Tatsache, daß konkurrierende Reads nicht blockieren, potentiell ein Performancegewinn zu erwarten sein. Wie das in deinem konkreten Fall aussieht, kannst nur du feststellen.
Man sollte auch bedenken, daß beide Systeme unterschiedliche Features haben. So gibt es bei TMonitor den Timeout bei Enter, das TryEnter und die Wait/Pulse Semantik. |
AW: TMonitor vs. TMultiReadExclusiveWriteSynchronizer
Ja das denke ich eben auch. Da ich häufig nur lese, müsste der TMultiReadExclusiveWriteSynchronizer eine ganz gute Wahl sein.
Was ich sonst z.T. auch gerne mache: Immutable Objects (als Interface) verwenden. Dann habe ich mit Lesen gar kein Problem und beim Schreiben wird einfach ein neues Objekt erzeugt. Dadurch braucht es überhaupt keine Sperrungen. Das funktioniert aber hauptsächlich nur bei kleinen, einfachen Objekten. Ein TDictionary sollte ich dann doch mit einem TMultiReadExclusiveWriteSynchronizer absperren. |
AW: TMonitor vs. TMultiReadExclusiveWriteSynchronizer
Zitat:
Referenzzählung bei Strings, dyn. Arrays und Interfaces wird ebenfalls über atomare CPU-Befehle vorgenommen, damit das threadsave ist, nur wird das halt direkt vom Compiler und der internen Verwaltung vom Delphi "heimlich" mit eingebaut und man muß sich um nix kümmern. Zitat:
Oder wenn das Lesen länger dauert, dann wird auch weniges gleichzeitiges Lesen Vorteile bringen |
AW: TMonitor vs. TMultiReadExclusiveWriteSynchronizer
Zitat:
|
AW: TMonitor vs. TMultiReadExclusiveWriteSynchronizer
Das kommt darauf an wie oft gleichzeitig lesend zugegriffen wird. Wenn in der Regel ohnehin nur einer gleichzeitig liest oder schreibt, ist TMonitor tendenziell etwas schneller, weil der TMultiReadExclusiveWriteSynchronizer mehr Aufwand betreiben muss.
Wenn viele wirklich gleichzeitig lesen, wird dies aber mehr als ausgeglichen, da dabei mit TMonitor jeder Thread warten müsste. Der Vorteil ist hier im Vergleich sehr viel höher, so dass ich im Zweifel den TMultiReadExclusiveWriteSynchronizer benutzen würde, wenn die Chance besteht, dass der Fall häufig eintritt, dass genau gleichzeitig gelesen wird. |
AW: TMonitor vs. TMultiReadExclusiveWriteSynchronizer
Zitat:
|
AW: TMonitor vs. TMultiReadExclusiveWriteSynchronizer
Ich kann im Detail hier nichts beitragen.
Aber ich habe gerade bei Video2Brain ein interessantes Tutorial zum Threading in .net gesehen: ![]() Da werden sehr detailliert die Feinheiten, Unterschiede und Fallstricke beschrieben (bis hin zu Problemen durch Prozessoroptimierungen (Stichwort "MemoryBarrier"). Ich habe das erst mal nur interessehalber durchgesehen und kann das im Detail nicht wiedergeben. In Bezug auf ReaderWriterLocks war das Fazit, dass man testen soll, ob dieser Lock im speziellen Fall Performancevorteile bringt. Vielleicht wäre das Video für den einen oder anderen ja ein paar Euro wert... |
AW: TMonitor vs. TMultiReadExclusiveWriteSynchronizer
Im Prinzip könnte man sich doch mal einen Wrapper schreiben, der Read/Write/ReadWrite-Locks als Funktionen bietet. (ReadWrite = Write)
Und dann kann man einfach, beim erstellen der LockInstanz das einbinden, was man brauch oder mal schnell ausprobieren will. Vom Code her ist es ja egal, ob der Code sagt "IchWillnenReadLock" und dann die jeweilige Implementation dann alles gleich lockt, wie z.B. bei der CriticalSection. Nur der Entwickler muß halt beim Schreiben eben immer angeben, ob er lesend, schreiben oder lesend+schreiben zugreift, egal, ob es dann ausgewertet wird, aber für die Codedokumentation wäre es zumindestens ein Vorteil. |
AW: TMonitor vs. TMultiReadExclusiveWriteSynchronizer
Ich verweise mal auf einem anderen Thread wo TMonitor vs TCriticalSection getetstet wurden.
![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:03 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz