Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Multithreading und Globale Funktionen (https://www.delphipraxis.net/157286-multithreading-und-globale-funktionen.html)

jfheins 14. Feb 2011 13:57

AW: Multithreading und Globale Funktionen
 
Zitat:

Zitat von schwa226 (Beitrag 1081582)
Ne, Data gehört zu jedem Thread selber der die Funktion aufruft.
D.h. jeder Thread ruft die Funktion auf mit seinen eigenen privat deklariertden Data mit unterschiedlicher länge. Ich bin mir halt nicht sicher, wenn sich schon ein Thread in der Funktion befindet das Result von einem anderen Thread wieder mit dem Result :=''; wieder zurückgesetzt wird. Oder hat jeder Aufruf sein eigenes Result? Oder ob dadurch das High(Data) auch verbogen wird?
Lokale Variabeln gelten ja für jeden eigenen Aufruf/Thread selber.

Damit (und dass jeder Thread einen eigenen Stack hat) ist doch alles gesagt? Es braucht keine Critical Section, da hier kein Zugriff auf gemeinsame Speicherbereiche erfolgt.
Auch High() wird dir immer das richtige Ergebnis zurückliefern. Wäre auch schlimm wenn nicht ;)

Zitat:

Zitat von schwa226 (Beitrag 1081588)
Ok, danke!
Dann werde ich das mal probieren und sehen ob es zu Exceptions kommt.
Mit dem "verbiegen" des High(Data) hatte ich gemeint, wenn der erste Thread z.B. mit Data[len=500] aufruft. Der zweite dann mit Data[len=3000]. Wenn nun auch i beim ersten Thread bis 2999 raufgezählt wird, dann gibt's natürlich Probleme weil der erste ja nur bis 499 geht.

Jeder Thread hat seine eigene Schleifenvariable i. Und auch der Vergleichswert (also das Ergebnis von High()) hat jeder Thread für sich.

Assarbad 14. Feb 2011 14:01

AW: Multithreading und Globale Funktionen
 
Zitat:

Zitat von jfheins (Beitrag 1081594)
Auch High() wird dir immer das richtige Ergebnis zurückliefern.

Woher nimmst du diese Zuversicht?
Code:
TBytes = array of Byte;
... in Sysutils.pas (RAD Studio 2009). Gibt's da irgendwelche Compiler-Magic oder wie weiß die aufgerufene Funktion über die Länge bescheid? Läuft das wie bei Strings? Habe mir nur noch nicht genügend Gedanken drüber gemacht, daher die Frage.

schwa226 14. Feb 2011 14:02

AW: Multithreading und Globale Funktionen
 
Danke für den Tipp mit BinToHex!
Das habe ich bis jetzt noch nie verwendet :oops:

Ich habe mir die Strings halt immer so aus den TBytes erzeugt.

Danke auch an jfheins!

jfheins 14. Feb 2011 15:00

AW: Multithreading und Globale Funktionen
 
Zitat:

Zitat von Assarbad (Beitrag 1081597)
Zitat:

Zitat von jfheins (Beitrag 1081594)
Auch High() wird dir immer das richtige Ergebnis zurückliefern.

Woher nimmst du diese Zuversicht?
Code:
TBytes = array of Byte;
... in Sysutils.pas (RAD Studio 2009). Gibt's da irgendwelche Compiler-Magic oder wie weiß die aufgerufene Funktion über die Länge bescheid? Läuft das wie bei Strings? Habe mir nur noch nicht genügend Gedanken drüber gemacht, daher die Frage.

Sowei ich weis, läuft das bei Strings ähnlich: Die Variable ist ein Pointer auf das erste Element, aber vorher (also an einem negativen Offset) wird die Länge seperat gespeichert. length() liest eben diesen Integer (oder sowas) aus und liefert den zurück. Da jeder Thread sein eigenes Array hat, gibt es keine Konflikte ;)

Assarbad 14. Feb 2011 16:05

AW: Multithreading und Globale Funktionen
 
Zitat:

Zitat von jfheins (Beitrag 1081616)
Sowei ich weis, läuft das bei Strings ähnlich: Die Variable ist ein Pointer auf das erste Element, aber vorher (also an einem negativen Offset) wird die Länge seperat gespeichert. length() liest eben diesen Integer (oder sowas) aus und liefert den zurück. Da jeder Thread sein eigenes Array hat, gibt es keine Konflikte ;)

Okidok. Danke für die Info ;)

Muß wohl wieder mal Delphiprogramme reversen. Die kommen einem im natürlichen Habitat so selten unter ... muß´ also vorher selber schreiben und dann reversen :zwinker:

schwa226 14. Feb 2011 17:54

AW: Multithreading und Globale Funktionen
 
Ich habe es nun auch live getestet.
3 Threads die die Funktion gleichzeitig nutzen. Ohne Critical Section.
Keine Probleme!

Sir Rufo 14. Feb 2011 21:18

AW: Multithreading und Globale Funktionen
 
Funktionen und Prozeduren sind von Haus immer threadsafe, weil alle lokalen Variablen bei jedem Aufruf neu erzeugt werden. Wäre dem nicht so, könnte man auch keine rekursiven Aufrufe von Proc und Funk machen.

Das Problem sind immer nur die Daten auf die dabei zugegriffen wird.
Also alles was nicht lokal zur Proc/Func gehört kann potentiell kritisch sein.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:23 Uhr.
Seite 3 von 3     123   

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