AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Multithreading und Globale Funktionen
Thema durchsuchen
Ansicht
Themen-Optionen

Multithreading und Globale Funktionen

Ein Thema von schwa226 · begonnen am 6. Jan 2011 · letzter Beitrag vom 14. Feb 2011
Antwort Antwort
Seite 3 von 3     123   
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#21

AW: Multithreading und Globale Funktionen

  Alt 14. Feb 2011, 13:57
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

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.

Geändert von jfheins (14. Feb 2011 um 14:00 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Assarbad
Assarbad

Registriert seit: 8. Okt 2010
Ort: Frankfurt am Main
1.234 Beiträge
 
#22

AW: Multithreading und Globale Funktionen

  Alt 14. Feb 2011, 14:01
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.
Oliver
"... aber vertrauen Sie uns, die Physik stimmt." (Prof. Harald Lesch)
  Mit Zitat antworten Zitat
schwa226

Registriert seit: 4. Apr 2008
400 Beiträge
 
#23

AW: Multithreading und Globale Funktionen

  Alt 14. Feb 2011, 14:02
Danke für den Tipp mit BinToHex!
Das habe ich bis jetzt noch nie verwendet

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

Danke auch an jfheins!
Delphi 2010, Update 4 & 5
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#24

AW: Multithreading und Globale Funktionen

  Alt 14. Feb 2011, 15:00
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
  Mit Zitat antworten Zitat
Benutzerbild von Assarbad
Assarbad

Registriert seit: 8. Okt 2010
Ort: Frankfurt am Main
1.234 Beiträge
 
#25

AW: Multithreading und Globale Funktionen

  Alt 14. Feb 2011, 16:05
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
Oliver
"... aber vertrauen Sie uns, die Physik stimmt." (Prof. Harald Lesch)
  Mit Zitat antworten Zitat
schwa226

Registriert seit: 4. Apr 2008
400 Beiträge
 
#26

AW: Multithreading und Globale Funktionen

  Alt 14. Feb 2011, 17:54
Ich habe es nun auch live getestet.
3 Threads die die Funktion gleichzeitig nutzen. Ohne Critical Section.
Keine Probleme!
Delphi 2010, Update 4 & 5
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#27

AW: Multithreading und Globale Funktionen

  Alt 14. Feb 2011, 21:18
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.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 3     123   


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 08:41 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