AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Mehrere Threads nur lesend auf ein TArray<TEinRecord> mit oder ohne Synchronize?
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von bernau · begonnen am 12. Mär 2025 · letzter Beitrag vom 12. Mär 2025
Antwort Antwort
Benutzerbild von bernau
bernau

Registriert seit: 1. Dez 2004
Ort: Köln
1.303 Beiträge
 
Delphi 12 Athens
 
#1

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

  Alt Gestern, 11:11
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.
Gerd
Kölner Delphi Usergroup: http://wiki.delphitreff.de
  Mit Zitat antworten Zitat
WladiD

Registriert seit: 27. Jan 2006
Ort: Celle
145 Beiträge
 
Delphi 11 Alexandria
 
#2

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

  Alt Gestern, 11:33
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.
Waldemar Derr
Profil bei GitHub
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.985 Beiträge
 
Delphi 12 Athens
 
#3

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

  Alt Gestern, 11:48
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...
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.314 Beiträge
 
Delphi 12 Athens
 
#4

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

  Alt Gestern, 11:59
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.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (Gestern um 12:04 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von bernau
bernau

Registriert seit: 1. Dez 2004
Ort: Köln
1.303 Beiträge
 
Delphi 12 Athens
 
#5

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

  Alt Gestern, 20:22
Danke für die Infos.

Das hilft mir sehr weiter.
Gerd
Kölner Delphi Usergroup: http://wiki.delphitreff.de
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:06 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