Strings in Threads ohne "Threadsafe"

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Beitrag von Thorium »

Toshy hat geschrieben: Das ist es was ich meinte, so aber leider auch noch icht in der Deutlichkeit laß.
Das heißt faktisch, das jeder so programmieren muß wie ich es gesagt habe. Komplett die gesammte Stringverwendung (Variablen, Befehle, Funkionen, denke auch mal Konstanten) muß mit einem einzigen Mutex gesichert sein. Dennoch kann dies bei Programmen die Geschwindigkeitsoptimiert sind sehr vorteilhaft sein. Und mit ein wenig "basteln" (Macros, Proceduren) kann man das recht leicht hinbekommen. Einzig vergessen darf man dann nix ;-)
Doch, doch. Das war sehr deutlich was du geschrieben hast und wir haben das auch alle verstanden und wie gesagt schon festgestellt. ^^
Aber das heisst nicht das jeder so programmieren muss. Das heisst einfach nur das man Threadsave aktivieren muss, wenn man mit Strings in Threads arbeitet. Ich gehe mal davon aus das ein Mutex langsamer ist als Threadsave. Könnte man aber mal testen.
Toshy hat geschrieben: @Freak:
ich denke einer von uns oder wir gemeinsam, sollten mal einen kurzen Text erstellen, der genau das was du jetzt geschrieben hast beinhaltet und dann mit in die PBhilfe unter Threads bzw. "threadsafe" eingefügt wird, damit es wirklich alle genau verstehen.
Ich bedanke mich mal wieder herzlichst bei dir für deine klare und gute Hilfe. (obwohl ich bis auf den globalen Speicherbereich ja schon aufgeklärt war)
Das wär mal ne Maßnahme. Weil die Andeutungen in der Hilfe sind einfach zu ungenau!
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Beitrag von Thorium »

Toshy hat geschrieben: So z.B. habe ich eine Procedure, jetzt ein Macro das ich anstatt von addelement und creatememory usw. nutze. die meisten überprüfen nicht ob auch überall der speicher korrekt erstellt wurde (besonders wenn man oft speicher allokiert). bei mir wir wenigstens der Code so lange nicht weiter ausgeführt bis Speicher allokiert wurde. Und sei es noch so unwahrscheinlich das Addelement mal einen Fehler auslöst.
Wie sieht das Macro denn aus? Es wartet bis Speicher allokiert werden konnte, in einer Schleife? Wenn ja, würde ich nicht so machen. Wenn kein Speicher allokiert werden konnte über AddElement oder AllocateMemory bedeutet das, dass nicht genügend freier Speicher vorhanden ist. In dem Sinne wäre es besser eine entsprechende Fehlermeldung auszugeben und entweder die Prozedur oder das komplette Programm, jenachdem, zu beenden. Ansonsten könntest du dir damit ne Falle für ne Endlosschleife gestrickt haben.
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
Toshy
Beiträge: 713
Registriert: 22.03.2005 00:29
Computerausstattung: Computer und Strom vorhanden
Wohnort: LK Wolfenbüttel

Beitrag von Toshy »

@Thorium:
Hi. Du hast dich da etwas verlesen. Ich hab nicht geschrieben, daß ich nicht deutlich war, sondern daß ich die Aussage von Freak bezüglich PB noch nicht so deutlich gelesen hatte.

Und natürlich muß jeder so programmieren "wenn er nicht threadsafe" nutzt. Darum geht es ja hier und immer mal wieder. Bei Threads sollte man immer threadsafe nutzen, aber es geht ja darum es NICHT zu nutzen, wegen dem Geschwindigkeitsverlust. Und wer die Kompileroption threadsafe nicht nutzt, muß es halt so machen. Das hast du vermutlich nur überlesen.

Bezüglich der Hilfe komme ich aktuell nicht dazu, aber mal sehn, einer von uns kommt vielleicht dazu. Du hast schon recht das es nicht deutlich genug in der Hilfe steht. Wenigstens sowas in der Art von "Der Threadsafekompilermodus ist bei Verwendung von Threads immer zu verwenden. Experten (!!!) können diesen Modus abschalten falls ihnen die interne Stringverwaltung bekannt ist und die damit entstehenden Probleme. Eine Verwendung von Stringvariablen, -funktionen, -befehlen ohne die Kompileroption in Thread ist kompliziert und eröffnet viele Gefahrenquellen !!!" Das sollte schon ohne weitere Erklärung mindestens drinn stehen.

@Theorium:
Ja, könnte ne Endlosschleife sein, aber das ist nicht so schlimm, denn dies geschieht nur, wenn kein Speicher da ist. Und eine Endlosschleife (mit Delay) ist immer noch besser, als wenn das Programm crasht. Endlos ja auch nur in soweit, bis wieder Speicher da ist. Es kommt öfter vor als man denkt, das kein Speicher mehr da ist, aber oft halt nur für milisekunden. Wenn die Auslagerungsdatei angepaßt wird oder so kommt das schon öfter mal vor. Man kann aber nicht jede eventualität mit Code komplett auffangen, man kann dann nur ne art Warteschleife bauen bis diese Situation erledigt ist und dann weiter im Code machen.
Allerdings ist in dem Macro auch ne Ifoption drinn, die ab einer bestimmen Anzahl an durchläufen eine Errormeldung ausgibt. Aus geschwindigkeitsgründen aber aktuell auskommentiert.
Im Endeffekt heißt es bei mir also nur, das ein Thread mal hängt falls kein Speicher da ist, dafür aber nicht crasht oder gar fehlerhaft arbeitet. Wenn kein Speicher da ist, kann man eh im Grunde kein programm weiter laufen lassen bzw. Code erstellen der dies auffängt, da man ja eh früher oder später in dem "Auffangcode" wieder Speicher braucht.
Hast aber ansonsten mit deiner Überlegung recht.

(noch mal als Hinweis: KEIN SPEICHER kommt recht oft vor, Windows gibt sogar die Ereignismeldung raus, wenn die Auslagerungsdatei / der virtuelle Speicher angepaßt wird, das in dieser Zeit Speicheranforderungen abgelehnt werden können. Eine einfache Programmschleife überbrückt solche Dinge aber wunderbar (bei mir wird je durchlauf das "delay()" um eine milisekunde erhöht.))
1. Win10
PB6.1
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Beitrag von Thorium »

Toshy hat geschrieben: (noch mal als Hinweis: KEIN SPEICHER kommt recht oft vor, Windows gibt sogar die Ereignismeldung raus, wenn die Auslagerungsdatei / der virtuelle Speicher angepaßt wird, das in dieser Zeit Speicheranforderungen abgelehnt werden können. Eine einfache Programmschleife überbrückt solche Dinge aber wunderbar (bei mir wird je durchlauf das "delay()" um eine milisekunde erhöht.))
Ah, sehr wertvolle Information. Wusste ich noch nicht, Danke. :allright:
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Beitrag von Thorium »

Toshy hat geschrieben: Und natürlich muß jeder so programmieren "wenn er nicht threadsafe" nutzt. Darum geht es ja hier und immer mal wieder. Bei Threads sollte man immer threadsafe nutzen, aber es geht ja darum es NICHT zu nutzen, wegen dem Geschwindigkeitsverlust. Und wer die Kompileroption threadsafe nicht nutzt, muß es halt so machen. Das hast du vermutlich nur überlesen.
Um nochmal darauf zurückzukommen. Man muss Threadsave nutzen, alles andere ist Leichtsinn und Performance spart man mit Sicherheit nicht, wenn man alle Stringoperationen mit Mutex absichern muss. Im Schlimmsten Fall bedeutet das 1ms Verzögerung pro String-Operation. Wird natürlich so nicht in der Praxis vorkommen aber soweit ich weis, wartet ein Mutex minimum 1ms, wenn der Mutex bereits gesperrt ist.
Da ist mir der threadlocal storage Stringbuffer von der Performance her lieber. :wink:

Zudem hab ich noch was anderes in der MSDN gefunden, was mir sagt das Threadsave einfach immer aktiviert werden sollte, bei mehreren Threads.
HeapAlloc

Serialization ensures mutual exclusion when two or more threads attempt to simultaneously allocate or free blocks from the same heap. There is a small performance cost to serialization, but it must be used whenever multiple threads allocate and free memory from the same heap. Setting the HEAP_NO_SERIALIZE value eliminates mutual exclusion on the heap. Without serialization, two or more threads that use the same heap handle might attempt to allocate or free memory simultaneously, likely causing corruption in the heap. The HEAP_NO_SERIALIZE value can, therefore, be safely used only in the following situations:

* The process has only one thread.
* The process has multiple threads, but only one thread calls the heap functions for a specific heap.
* The process has multiple threads, and the application provides its own mechanism for mutual exclusion to a specific heap.
Ich will garnicht wissen was es noch alles so für Sachen gibt die von Haus aus nicht Threadsave sind. Da müsste man ja bald jeden PB-Befehl mit Mutex schützen. Was natürlich blödsinnig wäre. Da spart man nix an Performance.
Toshy hat geschrieben: (noch mal als Hinweis: KEIN SPEICHER kommt recht oft vor, Windows gibt sogar die Ereignismeldung raus, wenn die Auslagerungsdatei / der virtuelle Speicher angepaßt wird, das in dieser Zeit Speicheranforderungen abgelehnt werden können. Eine einfache Programmschleife überbrückt solche Dinge aber wunderbar (bei mir wird je durchlauf das "delay()" um eine milisekunde erhöht.))
Kannst du mir dazu noch nen Link geben? Weil in der MSDN kann ich nix dazu finden. Weder im Memory Managment noch in den einzelnen Funktionen wird soetwas erwähnt. Es gibt auch keinen Error-Code dafür.
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
Toshy
Beiträge: 713
Registriert: 22.03.2005 00:29
Computerausstattung: Computer und Strom vorhanden
Wohnort: LK Wolfenbüttel

Beitrag von Toshy »

Toshy hat Folgendes geschrieben:

(noch mal als Hinweis: KEIN SPEICHER kommt recht oft vor, Windows gibt sogar die Ereignismeldung raus, wenn die Auslagerungsdatei / der virtuelle Speicher angepaßt wird, das in dieser Zeit Speicheranforderungen abgelehnt werden können. Eine einfache Programmschleife überbrückt solche Dinge aber wunderbar (bei mir wird je durchlauf das "delay()" um eine milisekunde erhöht.))

Kannst du mir dazu noch nen Link geben? Weil in der MSDN kann ich nix dazu finden. Weder im Memory Managment noch in den einzelnen Funktionen wird soetwas erwähnt. Es gibt auch keinen Error-Code dafür.
Nein, leider nicht. Das habe ich auf Benutzerebene gelesen. Meine Rechner sind recht langsam und oft ausgelastet (1 Ghz,.....)
Hin und wieder kommt da mal eine "kleines gelbes Dreieck" in der Taskleiste von Windows. Klicke ich drauf (oder schaue danach mal in der Windowsverwaltung) dann steht dort als Meldung halt das der Virtuelle Speicher angepaßt wird und in der Zeit Speicheranfragen abgewiesen werden können (so in der Art). Kommt nicht oft vor, hab es aber schon etliche Male gelesen.
Wie auch immer, sicher ist sicher ;-)
1. Win10
PB6.1
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Beitrag von PMV »

Hm ... hast du in der Zeit auch mal eine Fehlermeldung von einem
Programm bekommen, welches genau dieses Problem hatte?

MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Toshy
Beiträge: 713
Registriert: 22.03.2005 00:29
Computerausstattung: Computer und Strom vorhanden
Wohnort: LK Wolfenbüttel

Beitrag von Toshy »

Hi. Diese Meldungen kommen NICHT "Userprogrammen", sondern die kommt direkt vom Betriebssystem "Windows XP". Irgend ein x-beliebiges Programm / Systemprogramm / Dienst fordert speicher an, den das System nicht mehr vergeben kann (vermutlich wenn man die Auslagerungsdatei begrenzt). Geschieht dies, wird die begrenzung der Auslagerungsdatei vom System wohl einfach übergangen und die Datei "zwangsvergrößert". Dann kommt es zu dieser Meldung. Soweit habe ich das beobachtet bzw. vermutet, genau kann ich dazu nichts mehr sagen, da es selten vorkommt und ich jetzt auch keine Lust habe zu versuchen das zwangsweise auszprobieren. Die Fehlernummer kann ich daher auch nicht sagen.

Ich mache aber vielleicht doch gleich mal mein zweites fast baugleiches altes Notebook an und schaue mal ob ich da so ne Fehlermeldung erzwingen kann. Blöd nur, das ich gerade vor 5 Minuten einen viel größeren Speicher eingebaut habe, weil der alte kaputt war. hehe.

Also bis später... ich editiere dann vielleicht diesen Beitrag..

[edit]
Ich konnte es jetzt reproduzieren, aber etwas anders als sonst. JEtzt kam die Meldung schon bevor ich mich als User anmelde. Genauer Text:
DialogTitel:
Windows - Nicht genügend virtueller Speicher
DialogText:
"Nicht genügend virtueller Speicher. Die Auslagerungsdatei wird vergrößert. Speicheranforderungen können während dieses Vorgangs abgelehnt werden. Weitere Informationen finden sie in der Hilfe."
Was mich aber sehr wundert ist, das diese Meldung kommt, obwohl ich gerade 512 MB Ram eingebaut habe und so viel beim Start laut Taskmanager nicht verbraucht wird. Sehr eigenartig.
Habe das mal als Bitmap gespeichert, weiß aber nicht wie ich es hier zeigen könnte.
GoogleSuche:
http://www.google.de/search?num=100&hl= ... uche&meta=
1. Win10
PB6.1
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Beitrag von PMV »

Die Auslagerungsdatei hat äh ... nichts mit dem RAM zu tun ... die
befindet sich auf der Festplatte und die größe kannst du selber festlegen,
wenn Windows solchen mist macht. Und wenn dus falsch voreingestellt
hast ... erst recht ändern :wink:

Rechtsklick auf Arbeitsplatz -> Eigenschaften
-> Reihter Erweitert auswählen
-> unter Systemleistung auf Einstellungen klicken
-> Fenster "Leistungsoptionen" den Reihter Erweitert auswählen
-> unter Virtueller Arbeitsspeicher auf Ändern klicken
-> ich hab 1,5 GB als Mindestgröße angegeben, sicher ist sicher :mrgreen:

Und um auf meine Frage in dem Post vor dir zu kommen.
Damit mein ich natürlich NICHT Windows selber. :roll:
Mich interessierte, ob Programme aufgrund dessen abgeschmiert sind oder
Fehlermeldungen produziert haben. :|

MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag von Fluid Byte »

PMV hat geschrieben:Die Auslagerungsdatei hat äh ... nichts mit dem RAM zu tun ...
Huh? :shock:

http://de.wikipedia.org/wiki/Auslagerungsdatei
Windows 10 Pro, 64-Bit / Outtakes | Derek
Antworten