AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language C++ FloatToStr nicht Thread-sicher aber erweiterte Form?
Thema durchsuchen
Ansicht
Themen-Optionen

FloatToStr nicht Thread-sicher aber erweiterte Form?

Ein Thema von Mikkey · begonnen am 24. Jun 2015 · letzter Beitrag vom 24. Jun 2015
Antwort Antwort
Seite 1 von 2  1 2      
Mikkey

Registriert seit: 5. Aug 2013
265 Beiträge
 
#1

FloatToStr nicht Thread-sicher aber erweiterte Form?

  Alt 24. Jun 2015, 10:53
Delphi-Version: XE7
Was bedeutet die Aussage der Online-Hilfe?
Zitat:
Die erste Form von FloatToStrF ist nicht Thread-sicher
Inwieweit ist die zweite (erweiterte) Form der ~ToStr-Funktionen in einer Multithreading-Umgebung threadsicher, kann ich dieselbe TFormatSettings-Variable parallel in verschiedenen Threads verwenden?

Ihr könnt davon ausgehen, dass ich die Suchfunktion bereits zum glühen gebracht habe, aber dazu gibt es keine Aussage.

Es geht konkret um ein Projekt, in dem durchweg ein Punkt als Dezimaltrenner verwendet werden muss. Bisher sind DIE FormatSettings Bestandteil eines Objekts, das praktisch allen Programmteilen bekannt ist und eine Funktion zum Abruf dieser Struktur besitzt.
Kann die Funktion nun einen Zeiger auf die Formatsettings zurückgeben, muss der Inhalt zurückgegeben werden oder muss jeder Thread eine neue Struktur erzeugen?

Vielen Dank im Voraus

PS: Es ist ein C++-Projekt, aber da dürften ggü. Delphi keine Unterschiede bestehen.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: FloatToStr nicht Thread-sicher aber erweiterte Form?

  Alt 24. Jun 2015, 10:59
Daten sollten nicht unsychronsiert zwischen Thraeds geteilt werden.
Markus Kinzler
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#3

AW: FloatToStr nicht Thread-sicher aber erweiterte Form?

  Alt 24. Jun 2015, 11:46
Was bedeutet die Aussage der Online-Hilfe?
Das bedeutet, dass dir FloatToStr u. U. um die Ohren fliegen kann, weil irgendwer für den Preis 3,95 Euro in das Feld 3,95 eingibt (mit Komma), im System aber als Dezimaltrennzeichen ein Punkt (.) eingetragen ist und dein Programm deshalb ein 3.95 erwarten (mit Punkt).

Das FloatToStr richtet sich immer nach dem im System eingetragenem Dezimaltrennzeichen, was an für sich keine schlechte Idee ist. Das kann aber gelegentlich zu Problemen führen. Hier bist also nicht du der Herr über das Dezimaltrennzeichen in deinem Programm, sondern das System.

Wieso man das nun mit Thread-Sicherheit beschreibt fällt mir nicht ein. Gemeint ist aber damit, dass es u. U. zu Fehlermeldungen kommt wenn ein falsches Zeichen eingegeben wird. Mit der zweiten Form kann man nämlich FloatToStr mitteilen welches Dezimaltrennzeichen er beachten soll. Ein Beispiel:
Delphi-Quellcode:
var
  fs: TFormatSettings;
  s: string;
begin
  fs.DecimalSeparator := ','; //falls Komme erwünscht
  s := FloatToStr(3.95, fs);
  ShowMessage(s);
end;
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.110 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: FloatToStr nicht Thread-sicher aber erweiterte Form?

  Alt 24. Jun 2015, 12:27
Wieso man das nun mit Thread-Sicherheit beschreibt fällt mir nicht ein.
Naja, angenommen du gewöhnst dir einfach an, immer am globalen Decimal-Separator herumzuspielen wenn du es grade brauchst dann bekommst du ein Problem wenn du anfängst mit mehreren Threads zu arbeiten.

Die Hilfe erzählt manchmal gerne
Das beste ist, wo sie irgendwo zu Methoden eines TDataSets anfangen zu erklären, was eigentlich virtuelle Methoden sind. Wenn man ja schon dabei ist...
  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
 
#5

AW: FloatToStr nicht Thread-sicher aber erweiterte Form?

  Alt 24. Jun 2015, 12:44
Alle Funktionen, die z.B. mit den FormatSettings arbeiten sind nicht threadsafe, denn der interne Aufruf sieht so aus:
Delphi-Quellcode:
function FloatToStr(Value: Extended): string;
begin
  Result := FloatToStr(Value, FormatSettings); // GLOBALE Variable FormatSettings wird benutzt
end;
Und eine globale Variable ist nun mal nicht threadsafe (es gibt da Ausnahmen, aber die wollen wir mal aussen vor lassen), denn in diese kann man jederzeit von überall einfach reingreifen und verändern.

Korrekt wäre es einem Thread eine eigene FormatSettings Variable zu verpassen, die dann innerhalb des Threads verwendet wird.
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)

Geändert von Sir Rufo (24. Jun 2015 um 12:47 Uhr)
  Mit Zitat antworten Zitat
Mikkey

Registriert seit: 5. Aug 2013
265 Beiträge
 
#6

AW: FloatToStr nicht Thread-sicher aber erweiterte Form?

  Alt 24. Jun 2015, 12:49
Das bedeutet, dass dir FloatToStr u. U. um die Ohren fliegen kann
Ich habe mit Absicht nach FloatToStr gefragt, nicht nach StrToFloat . Ersteres fliegt einem in der Regel nicht um die Ohren.
Wieso man das nun mit Thread-Sicherheit beschreibt fällt mir nicht ein
Genau darum dreht sich aber die Frage, kann man sich auf die Umkehrung der OH-Aussage verlassen?

@mkinzler:
Üblicherweise können Daten, die nur gelesen werden, ohne Weiteres zwischen verschiedenen Threads geteilt werden.

@Günther:
Das macht Sinn, müsste dann aber auch den Schluss zulassen, dass ich mit einer einzelen FormatSettings-Struktur auch in mehreren Threads arbeiten kann?
  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
 
#7

AW: FloatToStr nicht Thread-sicher aber erweiterte Form?

  Alt 24. Jun 2015, 12:56
Das Hauptproblem ist doch, dass man die Zugriffe auf eine gemeinsame Struktur nicht kontrollieren kann. Man muss im gesamten Programm höllisch aufpassen, da nicht irgendwie reinzugrätschen um dadurch die lustigsten Fehler zu erhalten: "Geht meistens, aber nicht kurz nach Sonnenuntergang!"

Das ist das Salz in der Suppe beim Multi-Threading!
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
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#8

AW: FloatToStr nicht Thread-sicher aber erweiterte Form?

  Alt 24. Jun 2015, 12:57
Üblicherweise können Daten, die nur gelesen werden, ohne Weiteres zwischen verschiedenen Threads geteilt werden.
Man kann sich noch darüber streiten, ob das Starten eines Threads eine Synchronisation ist

Das ist das Salz in der Suppe beim Multi-Threading!
Und Speichersemantik sind die Speckgrieben.

Geändert von BUG (24. Jun 2015 um 13:04 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: FloatToStr nicht Thread-sicher aber erweiterte Form?

  Alt 24. Jun 2015, 13:35
Zitat:
nicht threadsicher
Ohne den Settings-Parameter gehen diese Funktionen auf die globale FormatSettings-Variable
und was ein nicht abgesicherter Zugriff auf globale Variablen bedeutet, daß verstehst du doch?
Vorallem wenn während dessen irgendwer diese Variable mal wieder bösartig verändern könnte.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Mikkey

Registriert seit: 5. Aug 2013
265 Beiträge
 
#10

AW: FloatToStr nicht Thread-sicher aber erweiterte Form?

  Alt 24. Jun 2015, 14:00
Es geht mir nicht darum, dass ich die globale Variable verwenden möchte, sondern darum, ob der Umkehrschluss, dass bei einer eigenen Variablen, die von allen Threads lesend(!) verwendet wird, Probleme auftreten können. Fall ja: Reicht eine flache Kopie der Struktur oder muss sie komplett neu erzeugt werden.

Als Hinweis:
Die vereinfachten Methoden FloatToStr etc. sind in C++ eh nicht verwendbar, weil die globalen Variablen DecimalSeparator etc. nicht verfügbar sind und auch über TFormatSettings::DecimalSeparator nicht ansprechbar.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      

 

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 04:44 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