Seite 1 von 2

DataObjects() not Thread-safe !?

Verfasst: Sa, 08. Jul 2017 14:51
von AUGE_OHR
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.

Re: DataObjects() not Thread-safe !?

Verfasst: So, 09. Jul 2017 7:41
von UliTs
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

Re: DataObjects() not Thread-safe !?

Verfasst: So, 09. Jul 2017 18:09
von brandelh
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 ?)

Re: DataObjects() not Thread-safe !?

Verfasst: Di, 11. Jul 2017 16:22
von ramses
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

Re: DataObjects() not Thread-safe !?

Verfasst: Mi, 12. Jul 2017 23:22
von UliTs
Public Variablen sind natürlich nicht Thread Save!
Das hat nichts mit DataObjects zu tun.

Re: DataObjects() not Thread-safe !?

Verfasst: Do, 13. Jul 2017 6:59
von ramses
Hallo Uli

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


Gruss Carlo

Re: DataObjects() not Thread-safe !?

Verfasst: Do, 13. Jul 2017 7:12
von UliTs
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

Re: DataObjects() not Thread-safe !?

Verfasst: Do, 13. Jul 2017 10:09
von ramses
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

Re: DataObjects() not Thread-safe !?

Verfasst: Do, 13. Jul 2017 10:20
von UliTs
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

Re: DataObjects() not Thread-safe !?

Verfasst: Do, 13. Jul 2017 11:44
von ramses
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

Re: DataObjects() not Thread-safe !?

Verfasst: Do, 13. Jul 2017 12:24
von brandelh
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)

Re: DataObjects() not Thread-safe !?

Verfasst: Do, 13. Jul 2017 12:29
von Jan
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

Re: DataObjects() not Thread-safe !?

Verfasst: Do, 13. Jul 2017 12:53
von ramses
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

Re: DataObjects() not Thread-safe !?

Verfasst: Do, 13. Jul 2017 13:03
von ramses
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

Re: DataObjects() not Thread-safe !?

Verfasst: Do, 13. Jul 2017 18:53
von AUGE_OHR
Jan hat geschrieben: Do, 13. Jul 2017 12:29Ansonsten 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.

Re: DataObjects() not Thread-safe !?

Verfasst: Fr, 14. Jul 2017 6:22
von Jan
Frank hat in der betreffenden Diskussion auf Andreas geantwortet und bestätigt, das die DataObjects grundsätzlich erst einmal thread safe seien.

Jan

Re: DataObjects() not Thread-safe !?

Verfasst: Fr, 14. Jul 2017 10:02
von ramses
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

Re: DataObjects() not Thread-safe !?

Verfasst: Fr, 14. Jul 2017 10:07
von brandelh
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.

Re: DataObjects() not Thread-safe !?

Verfasst: Fr, 14. Jul 2017 10:21
von ramses
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

Re: DataObjects() not Thread-safe !?

Verfasst: Fr, 14. Jul 2017 10:29
von brandelh
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

Re: DataObjects() not Thread-safe !?

Verfasst: Fr, 14. Jul 2017 14:58
von Frank Grossheinrich
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

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

Verfasst: Fr, 14. Jul 2017 15:13
von Frank Grossheinrich
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

Re: DataObjects() not Thread-safe !?

Verfasst: Fr, 14. Jul 2017 21:52
von ramses
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

Re: DataObjects() not Thread-safe !?

Verfasst: Fr, 14. Jul 2017 22:45
von Martin Altmann
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

Re: DataObjects() not Thread-safe !?

Verfasst: Sa, 15. Jul 2017 5:54
von ramses
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