DataObjects() not Thread-safe !?

Hier können die Unterschiede, Fehler und Probleme zwischen den Versionen bzw. bei der Migration besprochen werden

Moderator: Moderatoren

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 11464
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

DataObjects() not Thread-safe !?

Beitrag von AUGE_OHR » Sa, 08. Jul 2017 14:51

Andreas Gehrs-Pahl
8. Juli 2017
public.xbase++.generic
Re: TokenInit() TokenNext() ToeknEnd()

...
The same is true for DataObjects(), which should be using Synch Methods, as
accessing complex iVars, like Arrays or Objects -- or executing user-defined
Methods -- from multiple threads can create runtime errors or program hang-
ups, besides inconsistent data.
gruss by OHR
Jimmy

UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2536
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Kontaktdaten:

Re: DataObjects() not Thread-safe !?

Beitrag von UliTs » So, 09. Jul 2017 7:41

Warum zitierst Du diesen Beitrag?
Und was soll die Frage im Titel? Im Beitrag wird doch explizit gesagt, dass man auch für Data Objects Sync-Methoden definieren kann, oder?

Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 14587
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Re: DataObjects() not Thread-safe !?

Beitrag von brandelh » So, 09. Jul 2017 18:09

dass die nicht threadsave sind ist eine wichtige Aussage, ich hätte damit nicht gerechnet (dass die das nicht sind) ... local ist local !

die sync method wird sich eher auf die aufrufende Methode beziehen, ein dataobjekt hat ja keine Mehtoden. (oder ?)
Gruß
Hubert

ramses
Programmier-Gott
Programmier-Gott
Beiträge: 1061
Registriert: Mi, 28. Jul 2010 17:16

Re: DataObjects() not Thread-safe !?

Beitrag von ramses » Di, 11. Jul 2017 16:22

Ich verwende eine Public-Variable mit einem DataObject zum Ablegen von Handles und Zusänden in einem WebProgramm.
Dabei habe ich mich schon einige male gewundert wieso das Object zum Teil den Inhalt verloren hat ...

Gruss Carlo

UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2536
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Kontaktdaten:

Re: DataObjects() not Thread-safe !?

Beitrag von UliTs » Mi, 12. Jul 2017 23:22

Public Variablen sind natürlich nicht Thread Save!
Das hat nichts mit DataObjects zu tun.
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück

ramses
Programmier-Gott
Programmier-Gott
Beiträge: 1061
Registriert: Mi, 28. Jul 2010 17:16

Re: DataObjects() not Thread-safe !?

Beitrag von ramses » Do, 13. Jul 2017 6:59

Hallo Uli

Das DataObject muss ja wohin. Wohin würdest du es (das DataObject) den tun damit es Thread-Save ist????


Gruss Carlo

UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2536
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Kontaktdaten:

Re: DataObjects() not Thread-safe !?

Beitrag von UliTs » Do, 13. Jul 2017 7:12

Hallo Carlo,

wenn ich dich richtig verstehe möchtest Du auf eine DataObject-Instanz von verschiedenen Threads aus zugreifen (schreibend und lesend). Dann mußt Du garantieren, dass dies "Thread safe" geschieht. Und das geschieht mit den Sync-Methoden. Ich kann das leider nicht so aus dem Ärmel schütteln aber da müsste man sich einarbeiten.

Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück

ramses
Programmier-Gott
Programmier-Gott
Beiträge: 1061
Registriert: Mi, 28. Jul 2010 17:16

Re: DataObjects() not Thread-safe !?

Beitrag von ramses » Do, 13. Jul 2017 10:09

Hallo Uli

eine Synch Methode ist bei meinem HTTP Handler (xb2net) nicht vorgesehen und vermutlich auch gar nicht umsetztbar. Ich suche einen anderen Weg ... Schade dass das DataObject nicht Threadsave ist.

Gruss Carlo

UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2536
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Kontaktdaten:

Re: DataObjects() not Thread-safe !?

Beitrag von UliTs » Do, 13. Jul 2017 10:20

ramses hat geschrieben:
Do, 13. Jul 2017 10:09
Hallo Uli

eine Synch Methode ist bei meinem HTTP Handler (xb2net) nicht vorgesehen und vermutlich auch gar nicht umsetztbar. Ich suche einen anderen Weg ... Schade dass das DataObject nicht Threadsave ist.

Gruss Carlo
Hallo Carlo,

was spricht denn dagegen statt des DataObject eine Klasse zu verwenden?
Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück

ramses
Programmier-Gott
Programmier-Gott
Beiträge: 1061
Registriert: Mi, 28. Jul 2010 17:16

Re: DataObjects() not Thread-safe !?

Beitrag von ramses » Do, 13. Jul 2017 11:44

Hallo Uli
was spricht denn dagegen statt des DataObject eine Klasse zu verwenden?
Da bist du ja wieder genau am selben Ort. Der HTTP Handler ist bereits eine Klasse die für jede Web-Anfrage einen Thread aus einem Threadpool mit dem Programmcode startet. Um nicht jedesmal z.B. einen neuen L&L Job zu öffnen muss ich die verschiedenen Handles zur wiederverwendung irgendwo speichern. Vorher hab ich diese in eine DBF geschrieben, jeder Thread hat ja eine eindeutige Nummer das hat gut funktioniert. Aus verschiedenen Gründen wollte ich diese Angaben im Arbeitsspeicher vorhalten. Ich gehe nun zurück zu alten Fassung.

Gruss Carlo

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 14587
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Re: DataObjects() not Thread-safe !?

Beitrag von brandelh » Do, 13. Jul 2017 12:24

Mehrere Threads auf eine L&L Instanz, was soll das bringen außer Mischmasch ?

Ich käme nie auf die Idee eine andere Variablenart als LOCAL zu nutzen, außer es ist readonly z.B. Fixe Werte (dann Public)
Gruß
Hubert

Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 13115
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Kontaktdaten:

Re: DataObjects() not Thread-safe !?

Beitrag von Jan » Do, 13. Jul 2017 12:29

Ich misch mich da mal quer ein. Ich selber benutze ja auch stapelweise DataObjects. Und hatte damit auch bislang noch nie Probleme - auch nicht in Thread-Anwendungen. Aber klar, bei mir sind die halt alle LOCAL.

Ich kann mir aber irgendwie nicht vorstellen, das Alaska eine für die so wichtige Klasse schreibt und dabei nicht auf Thread-Sicherheit achtet. Seid Ihr sicher, das daran liegt, und nicht an irgendwelchen anderen Dingen?

Ansonsten wäre das doch mal eine Frage an Alaska wert, oder?

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.

ramses
Programmier-Gott
Programmier-Gott
Beiträge: 1061
Registriert: Mi, 28. Jul 2010 17:16

Re: DataObjects() not Thread-safe !?

Beitrag von ramses » Do, 13. Jul 2017 12:53

Hallo Hubert

L&L war nicht das optimale Beispiel, die erwähnten Thread' müssen immer etwa die gleichen Arbeiten ausführen, da die Thread in einem Pool sind, d.h. beendete Thread auf die erneute Verwendung warten können die Verarbeitungshandles auf die verschiedenen DLL's "aufbewahrt" werden und nicht jedesmal einen neuen Handle anzufordern. Da es bei einigen DLL's zu Sorgen durch dauerndes öffnen/schliessen kam entstand diese Lösung. Bei L&L einigen anderen war es einmal oder ist es sehr wichtig nicht alle Jobs zu schliessen sondern mindestens einen stehen zu lassen.

Gruss Carlo

ramses
Programmier-Gott
Programmier-Gott
Beiträge: 1061
Registriert: Mi, 28. Jul 2010 17:16

Re: DataObjects() not Thread-safe !?

Beitrag von ramses » Do, 13. Jul 2017 13:03

Hallo Jan

Nein, sicher bin ich mir nicht.
Es ist mir beim Testen aufgefallen dass mein DataObject ab und zu den Inhalt verlor.
Keine Ahnung wieso. Ich habe die spezielle Verwendung des Data-Objects aufgegeben und verwende wieder eine DBF.
Dies deshalb da der Cargo-Slot bereits verwendet ist. Änderungen daran würden einen Umfangreichen Test der gesamten Web-App bedeuten, was ich montan nicht möchte.

Gruss Carlo

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 11464
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: DataObjects() not Thread-safe !?

Beitrag von AUGE_OHR » Do, 13. Jul 2017 18:53

Jan hat geschrieben:
Do, 13. Jul 2017 12:29
Ansonsten wäre das doch mal eine Frage an Alaska wert, oder?
kannst ja im Alaska Forum unter dem o.g. Thread nachfragen "was" AGP mit seiner Antwort meint.
gruss by OHR
Jimmy

Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 13115
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Kontaktdaten:

Re: DataObjects() not Thread-safe !?

Beitrag von Jan » Fr, 14. Jul 2017 6:22

Frank hat in der betreffenden Diskussion auf Andreas geantwortet und bestätigt, das die DataObjects grundsätzlich erst einmal thread safe seien.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.

ramses
Programmier-Gott
Programmier-Gott
Beiträge: 1061
Registriert: Mi, 28. Jul 2010 17:16

Re: DataObjects() not Thread-safe !?

Beitrag von ramses » Fr, 14. Jul 2017 10:02

Ich habe rausgefunden wann es mir das DatObject zerschiesst. Der Ablauf ist etwa so: DataObject in einer Public Var anlegen. Xbase-DLL laden, der Code in dieser DLL nutzt das DataObject (fügt) neue Vars ein, dann DLL entladen dann ist oft auch das Dataobject zerstört.

Gruss Carlo

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 14587
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Re: DataObjects() not Thread-safe !?

Beitrag von brandelh » Fr, 14. Jul 2017 10:07

wie und warum wird die DLL entladen ?

Bei QuickPDF habe ich die Erfahrung gemacht, dass DLLUNLOAD() den dortigen internen Speicher nicht sauber freigibt und die Anwendung Speicher frisst.
Lasse ich das weg, wird keiner gefressen ... auch nach 10.000 PDFs bleibt der Verbrauch konstant (neues PDF etwas mehr ... nach schließen des PDF wieder alter Wert).
Nach Ende der EXE ist alles aus dem Speicher.
Gruß
Hubert

ramses
Programmier-Gott
Programmier-Gott
Beiträge: 1061
Registriert: Mi, 28. Jul 2010 17:16

Re: DataObjects() not Thread-safe !?

Beitrag von ramses » Fr, 14. Jul 2017 10:21

Hallo Hubert

das Laden und Entladen von in Xbase geschriebenem Code ist Teil des Entwicklungs und Test Konzeptes von xb2net für Web-App's. Dies vereinfacht die Entwicklung und Test ganz extrem. Du kannst etwas in der PRG Datei ändern und im Browser Reload drücken dann wird der Code automatisch neu kompiliert und die alte DLL entladen und die mit dem neuen geänderten Code geladen. Mal so einfach gesagt. In der definitven Version werden die DLL's statisch geladen oder der Code direkt an die EXE gelinkt.

Gruss Carlo

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 14587
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Re: DataObjects() not Thread-safe !?

Beitrag von brandelh » Fr, 14. Jul 2017 10:29

ramses hat geschrieben:
Fr, 14. Jul 2017 10:21
das Laden und Entladen von in xbase geschriebenem Code ist Teil des Entwicklungs und Test Konzeptes von xb2net für Web-App's.
ah, Xbase++ Dlls, das ist natürlich was anderes :D
Gruß
Hubert

Benutzeravatar
Frank Grossheinrich
Rookie
Rookie
Beiträge: 11
Registriert: Fr, 31. Mär 2017 15:06
Wohnort: Krichheim an der Weinstraße
Kontaktdaten:

Re: DataObjects() not Thread-safe !?

Beitrag von Frank Grossheinrich » Fr, 14. Jul 2017 14:58

ramses hat geschrieben:
Fr, 14. Jul 2017 10:02
Ich habe rausgefunden wann es mir das DatObject zerschiesst. Der Ablauf ist etwa so: DataObject in einer Public Var anlegen. Xbase-DLL laden, der Code in dieser DLL nutzt das DataObject (fügt) neue Vars ein, dann DLL entladen dann ist oft auch das Dataobject zerstört.
Ich habe die ein oder andere Frage:
1) werden dann in die iVars auch gleich Werte übertragen?
2) sind diese Werte statische Werte? (also Literale, die statisch im Code stehen)
3) wie ist die DLL gebaut? Was sind die Compiler-Switches und die Link-Switches? (DYNAMIC)

Ich wäre BRENNEND an einem Beispiel interessiert. Bitte an mich oder an unseren Support!
Danke, Frank

Benutzeravatar
Frank Grossheinrich
Rookie
Rookie
Beiträge: 11
Registriert: Fr, 31. Mär 2017 15:06
Wohnort: Krichheim an der Weinstraße
Kontaktdaten:

Re: DataObject()s ARE Thread-safe !!!

Beitrag von Frank Grossheinrich » Fr, 14. Jul 2017 15:13

Jan hat geschrieben:
Fr, 14. Jul 2017 6:22
Frank hat in der betreffenden Diskussion auf Andreas geantwortet und bestätigt, das die DataObjects grundsätzlich erst einmal thread safe seien.
Bitte stellt doch solche Fragen bei uns in der Newsgroup.
DataObject() sind thread-safe! Wie alles in Xbase++! Wenn dem so nicht ist, dann ist das ein Fehler und muss behoben werden!

Was ist thread-safe? Ich habe den Eindruck, dass ihr den Begriff falsch verwendet. Und sich da etwas Falsches im Kopf manifestiert.
Thread-safe bedeutet, dass ihr eine Variable (DataObject() oder was auch immer) über Threads hinweg lesen und schreiben könnt und euch das Ganze nicht um die Ohren fliegt. Ihr müsst euch nicht darum kümmern, ob gerade 10 Threads gleichzeitig auf einer Variablen "rumnageln". Das nimmt euch die Xbase++ Runtime ab. Aber dass die Variable verändert werden kann und mit welchem Inhalt zu welcher Zeit, dafür seid ihr zuständig. Threads sind auch nicht deterministisch. Wenn die Reihenfolge wichtig ist, wann was abgearbeitet werden soll, dann müsst ihr Vorsorge treffen.

Im Umkehrschluss: thread-safe bedeutet NICHT, dass eine Variable geschützt ist in einem anderen Thread.

Und auch, wenn ich Andreas Gehrs-Pahl sehr schätze, er hat nicht immer recht.

Gruß, Frank

ramses
Programmier-Gott
Programmier-Gott
Beiträge: 1061
Registriert: Mi, 28. Jul 2010 17:16

Re: DataObjects() not Thread-safe !?

Beitrag von ramses » Fr, 14. Jul 2017 21:52

Hallo Frank

zu deinen Fragen:
1) werden dann in die iVars auch gleich Werte übertragen?
Ja, es sind verschiedene Nummerischen Werte sowie einige Arrays. Es werden alle mit Daten bestückt.
2) sind diese Werte statische Werte? (also Literale, die statisch im Code stehen)
Nein, es sind alles Werte die aus local oder static Vars übertragen werden.
3) wie ist die DLL gebaut? Was sind die Compiler-Switches und die Link-Switches? (DYNAMIC)
XPP %1%2.prg /o%1 /a /m /n /q /v /err:3 /dll:dynamic /link:"/dll /out:%1%2.dll" 2>nul

Das DataObject() wird leer beim Programmstart angelegt und danach in der beschriebenen DLL mit Werten befüllt wenn diese Werte noch nicht vorhanden sind.

Für meine Zwecke erstelle ich nun das DataObject() beim erneuten laden der DLL einfach neu. So ist das Problem während der Entwicklung beseitigt.

Leider kann die News-Gruppe nicht mit einem Browser besucht werden .... deshalb kann ich da nicht mitlesen/schreiben.
Ein extra Programm dazu installieren kommt für mich gar nicht in Frage.... das ist ja wie vor 20 Jahren .....

Gruss Carlo

Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 14534
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Kontaktdaten:

Re: DataObjects() not Thread-safe !?

Beitrag von Martin Altmann » Fr, 14. Jul 2017 22:45

Moin Carlo,
ramses hat geschrieben:Leider kann die News-Gruppe nicht mit einem Browser besucht werden ....
:arrow: http://news.alaska-software.com/

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
stellv. Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.

ramses
Programmier-Gott
Programmier-Gott
Beiträge: 1061
Registriert: Mi, 28. Jul 2010 17:16

Re: DataObjects() not Thread-safe !?

Beitrag von ramses » Sa, 15. Jul 2017 5:54

Hallo Martin

Danke für den Tip.
Hab ich nicht gewusst/versucht. Auf der Alaska Seite steht: "So richten Windows Live / Thunderbird für Newsgruppen ein" ich dachte es sei noch wie früher, es ohne News Reader nicht geht. Aber mir gefällt es hier viel besser....

Gruss Carlo

Antworten