Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Mehrere Threads nur lesend auf ein TArray<TEinRecord> mit oder ohne Synchronize? (https://www.delphipraxis.net/216840-mehrere-threads-nur-lesend-auf-ein-tarray-teinrecord-mit-oder-ohne-synchronize.html)

bernau 12. Mär 2025 11:11

Mehrere Threads nur lesend auf ein TArray<TEinRecord> mit oder ohne Synchronize?
 
Ich habe ein TArray<TIrgendeinRecord>. TIrgendeinRecord kann grundsätzlich alle möglichen Simple Datentypen beinhalten.

Dieses Array wird einmalig mit Daten gefüllt. Um die Hunderttausend Einträge. Danach werden mit diesen Daten nur noch Auswertungen durchgeführt. Also nur lesend.

Ich würde nun gerne mit mehrere Threads die Auswertungen parallel durchführen. Da sichergestellt ist, dass die Daten nicht geändert werden, sollte es doch möglich sein, auf die Daten ohne TThread.Synchronize zuzugreifen. Oder?

Ich habe natürlich schon vorher mal gegoogelt. Aber da teilen sich die Meinungen sehr. Außerdem sind viele Infos sehr alt und vielleicht gibt es ja in neuen Delphi-Versionen neue Techniken, die ich einfach übersehen habe.

WladiD 12. Mär 2025 11:33

AW: Mehrere Threads nur lesend auf ein TArray<TEinRecord> mit oder ohne Synchronize?
 
Wenn TIrgendeinRecord keine Instanztypen enthält, kannst du jedem Thread einfach das gefüllte TArray<TIrgendeinRecord> zuweisen. Da dynamische Arrays refcounted sind, muss auch nichts aufwändig kopiert werden und du brauchst dann auch sicher kein Synchronize.

QuickAndDirty 12. Mär 2025 11:48

AW: Mehrere Threads nur lesend auf ein TArray<TEinRecord> mit oder ohne Synchronize?
 
Zitat:

Zitat von bernau (Beitrag 1547003)
Ich habe ein TArray<TIrgendeinRecord>. TIrgendeinRecord kann grundsätzlich alle möglichen Simple Datentypen beinhalten.

Dieses Array wird einmalig mit Daten gefüllt. Um die Hunderttausend Einträge. Danach werden mit diesen Daten nur noch Auswertungen durchgeführt. Also nur lesend.

Ich würde nun gerne mit mehrere Threads die Auswertungen parallel durchführen. Da sichergestellt ist, dass die Daten nicht geändert werden, sollte es doch möglich sein, auf die Daten ohne TThread.Synchronize zuzugreifen. Oder?

Ich habe natürlich schon vorher mal gegoogelt. Aber da teilen sich die Meinungen sehr. Außerdem sind viele Infos sehr alt und vielleicht gibt es ja in neuen Delphi-Versionen neue Techniken, die ich einfach übersehen habe.

Es müsste gehen. Aber du kannest es auch mit einem Syncobjs.TMREW absichern (Multiple Read , Single Write).
Das beste ist immer wenn die Daten in den Thread übergibts und dann im Hauptthread keine Referenz mehr auf diese daten verweist. Dann kannst du sicher sein, dass die daten nicht aus dem Huaptthread zugegriffen werden. Bei Abschluss des Threads kann der thread ja auch eine Referenz auf die Daten wiedergeben...dann braucht es kein zugriffsmanagement über CS oder MREW.
Bei mehreren Threads müste es möglich sein Referenzen zu übergeben die nur bestimmte Teile der Daten sehen können bzw. das sicherste sind halt immer kopien aber das ist ja mit etwas overhead verbunden...

himitsu 12. Mär 2025 11:59

AW: Mehrere Threads nur lesend auf ein TArray<TEinRecord> mit oder ohne Synchronize?
 
Die Referenzzälungen von dynamischen Arrays, LongStrings (also Delphi-Strings und WideString, aber nicht ShortString) und Interfaces sind per se thread-save.
So lange nur lesend zugegriffen wird, dann gibt es somit keine Probleme.

ACHTUNG, Lesezugriffe sind nicht immer NUR lesend,
denn z.B. aus einem TStream zu lesen, verändert intern die Positionsdaten.



Ach ja, TThread.Synchronize ist kein Allheilmittel.
Es verschiebt die Ausführungen aufwändig in den Hauptthread, womit es per se keine gleichzeitigen Zugriffe gibt.
CriticalSections, MultiReadSingleWriteSynchronisierer und Dergleichen werden dagegen effektiver sein.

bernau 12. Mär 2025 20:22

AW: Mehrere Threads nur lesend auf ein TArray<TEinRecord> mit oder ohne Synchronize?
 
Danke für die Infos.

Das hilft mir sehr weiter.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:48 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 by Thomas Breitkreuz