AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Ist SetLength Thread-safe?

Ein Thema von iphi · begonnen am 24. Okt 2009 · letzter Beitrag vom 25. Okt 2009
Antwort Antwort
Seite 2 von 2     12   
Tryer

Registriert seit: 16. Aug 2003
200 Beiträge
 
#11

Re: Ist SetLength Thread-safe?

  Alt 25. Okt 2009, 13:48
Wenn die Größe eines Arrays geändert wird kann es sein das das gesamte Array im Speicher verschoben wird. Auch hierbei muss also synchronisiert werden, um heimtückische (weil selten auftretende) Fehler zu vermeiden. Man hängt vermeindlich nur hinten etwas an, aber auch das erste Element wird im Speicher verschoben.

Reine Lesezugriffe müssen natürlich nicht synchronisiert werden.
Neben den CritialSections gibt es noch andere Möglichkeiten der Synchronisation (Mutex, Semaphore, Events, Messages..) wo der eine Thread dem anderen klar sagt "ich bin fertig und warte jetzt bis du fertig bist".
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

Re: Ist SetLength Thread-safe?

  Alt 25. Okt 2009, 13:55
genau sowas verhindern dieses TMultiSync-Dinger

sie erlauben gleichzeitige Lesezugriffe, aber nur wenn in diesem Moment nicht schreibend zugegriffen wird
oder sie erlauben nur einen Schreibzugriff und sonst nix.

somit ist sichergestellt, daß immer nur einer ändert
und man nicht lesen kann, wärend geändert wird.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
iphi

Registriert seit: 13. Feb 2009
262 Beiträge
 
Delphi 7 Personal
 
#13

Re: Ist SetLength Thread-safe?

  Alt 25. Okt 2009, 14:27
Ok, so langsam kapiere ich wie das Memorymanagement funktioniert. Ich habe mich schon immer gefragt, wie es funktioniert, ein array dynamisch zu vergrößern, wenn am Ende des arrays kein Platz mehr ist...

Diese Umkopiererei will ich eigentlich vermeiden.

Wenn mein Pointerarray statisch ist (=vordefinierte Länge), dann müsste es doch fix im Speicher liegen, oder? Die Pointer(=dynamische Arrays) zeigen dann auf nil oder auf dynamische Arrays fixer Länge.
Bsp:
Delphi-Quellcode:
type
  Tx: array of char;
x: array[0..100] of Tx;
Wenn ich z.B. setlength(x[50],100) mache, würde das die restlichen Arrays x[i] (sofern allokiert) im Speicher fix lassen oder würden die ggf. auch umkopiert werden?

P.S. Hab in Delphi6 TMultiReadExclusiveWriteSynchronizer gefunden. Der scheint ein geeignetes Werkzeug für meine Anwendung, oder?

Gruß Thomas
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#14

Re: Ist SetLength Thread-safe?

  Alt 25. Okt 2009, 14:31
Nur x[50] kann umkopiert werden. Der Speichermanager weiß ja gar nicht, wo sich Referenzen zu den anderen Speicherblöcken befinden.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
iphi

Registriert seit: 13. Feb 2009
262 Beiträge
 
Delphi 7 Personal
 
#15

Re: Ist SetLength Thread-safe?

  Alt 25. Okt 2009, 15:09
Ok, das ginge also. Das mit dem statischen Array ist allerdings unschön, weil ich a priori gar nicht weiß, wie viele Datenblöcke kommen werden und es halt unschön ist ein überlanges Array von Pointern vorzuhalten.

Was gibt es denn noch für Möglichkeiten, dynamisch wachsende sequentiell schreib- und lesbare Datenstrukturen zu realisieren? Ich könnte mir so etwas wie eine verkettete Liste, d.h. jeder Datenblock enthält einen Pointer auf den nächsten Datenblock vorstellen. Wie könnte ich solche Strukturen in Delphi dynamisch erzeugen/vergrößern?
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#16

Re: Ist SetLength Thread-safe?

  Alt 25. Okt 2009, 15:32
Verkettete Listen sind für Aufgaben mit mehreren Threads richtig genial. Man kann dort nämlich völlig ohne Locks auskommen. Windows stellt zum Beispiel Funktionen für einen Stack zur Verfügung, der mit beliebig vielen zugreifenden Threads immer konsistent bleibt. Queues lassen sich auch auf diese Weise implementieren, das ist allerdings ein bisschen komplizierter. Ich habe das auch mal gemacht, der Code ist allerdings ungetestet und komplett in Assembler. Falls es dich interessiert kann ich die Unit hochladen.

Was spricht jetzt eigentlich gegen Arrays? Gut, du brauchst immer irgendein Lock, aber in den meisten Fällen ist das vernachlässigbar.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

Re: Ist SetLength Thread-safe?

  Alt 25. Okt 2009, 15:44
Auch verkettete Listen müssen abgesichert werden!
Aber dort kann man es so einrichten, daß man jedes Element einzeln absichert und nicht die ganze Liste auf einmal ... so lassen sich viele Zugriffe an verschiedenen Stellen womöglich besser optimieren, da sie sich so nicht gegenseitig stören.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#18

Re: Ist SetLength Thread-safe?

  Alt 25. Okt 2009, 15:46
Du kannst verkettete Listen so aufbauen, dass du keine Locks, sondern nur Compare-and-Swap brauchst.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

Re: Ist SetLength Thread-safe?

  Alt 25. Okt 2009, 15:54
Zitat von Apollonius:
Du kannst verkettete Listen so aufbauen, dass du keine Locks, sondern nur Compare-and-Swap brauchst.
Compare-and-Swap/InterlockedExchange zähle ich mit zum Absichern.

drum hab ich auch nicht looken/sperren sondern "absichern" gesagt
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 22:26 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz