Seite 1 von 2

PB 4.20 Crash mit Option Threadsafe

Verfasst: 21.06.2008 11:22
von Danilo
Folgender Code crasht bei mir immer, wenn ich mit Threadsafe und
ohne Debugger kompiliere:

Code: Alles auswählen

Procedure MyThread(a)
  Delay(1000)
EndProcedure

CreateThread( @MyThread(), 0)

; MessageRequester("Info","OK")

;Delay(1000)
Beep_(800,2000)
In der IDE Debugger aus und '[X] create threadsafe executable' anschalten.

Mit Debugger geht es.
Ohne Threadsafe geht es.
Mit Threadsafe geht es nicht.
Mit Threadsafe geht es, wenn ich das MessageRequester wieder reinmache.

Der Fehler ist mir aufgefallen, als mein Programm plötzlich crashte,
nachdem ich den Debugger ausschaltete - vorher lief alles einwandfrei.
Ich habe dann versucht das Problem einzugrenzen, bis ich zu diesem
Minimalbeispiel gekommen bin.

Ich habe rebootet, nicht das es an meinem System liegt. Und ich habe
es auch an der Console kompiliert:

Code: Alles auswählen

pbcompiler /THREAD CRASH.pb
Irgendwas scheint da nicht zu stimmen?

Verfasst: 21.06.2008 11:30
von marco2007
Bestätigt.
Komischer Crash...

Verfasst: 21.06.2008 11:52
von Danilo
marco2006 hat geschrieben:Bestätigt.
Danke, da bin ich wenigstens erstmal etwas beruhigt und muß nicht
mehr an mir selbst zweifeln.
marco2006 hat geschrieben:Komischer Crash...
In der Tat. Ich habe auch die 2 /COMMENTED (mit und ohne MessageRequester)
geDIFFt, konnte aber keine nennenswerten Unterschiede feststellen, die das
Problem sein könnten. Sieht mehr nach etwas internem aus.

Verfasst: 21.06.2008 14:03
von ts-soft
PB linkt den Stringmanager nicht mit, weil kein String vorhanden, aber
ThreadSafe benötigt den wohl.

Da haben sie wohl einen Fehler hinein optimiert :mrgreen:

Verfasst: 21.06.2008 14:03
von Falko
Diesen Bug kann ich ebenfalls bestätigen.

Ich möchte noch ne Kleinigkeit hinzufügen.

Wenn man die Variable a zur Stringvariable a.s macht funktioniert es komischerweise auch.

Gruß Falko

[Edit] ts-soft war wohl schneller :lol: [/Edit]

Verfasst: 21.06.2008 14:10
von ts-soft
ThreadSafe ist aber sowieso sinnlos, wenn keine Strings vorhanden :wink:
Aber Bug ist es trotzdem, weil auch sinnloses sollte funktionieren

Gruß
Thomas

Verfasst: 21.06.2008 14:19
von Danilo
ts-soft hat geschrieben:ThreadSafe ist aber sowieso sinnlos, wenn keine Strings vorhanden :wink:
Aber Bug ist es trotzdem, weil auch sinnloses sollte funktionieren
Wie gesagt, der Fehler ist mir bei einem richtigen Source von mir aufgefallen,
nachdem ich es ohne Debugger ausprobieren wollte.
Threadsafe hatte ich angeschalten, da sonst die Debug-Ausgabe durcheinander kam (Strings).

Als ich den Debugger ausgeschalten habe, waren aber keine Strings
mehr im Programm, da alle Strings hinter 'Debug' verwendet wurden.
So klärt sich alles auf.

Fred schaut grad mal, habs ihm im Chat gesagt.

Verfasst: 21.06.2008 14:23
von ts-soft
Hier mal ein sinnfreies workaround :mrgreen:

Code: Alles auswählen

CompilerIf #PB_Compiler_Thread
  CompilerIf #PB_Compiler_Unicode
    Import "StringManagerThreadUnicode.lib" : EndImport
  CompilerElse
    Import "StringManagerThread.lib" : EndImport
  CompilerEndIf
CompilerEndIf

Procedure MyThread(a)
  Delay(1000)
EndProcedure

CreateThread( @MyThread(), 0)

; MessageRequester("Info","OK")

;Delay(1000)
Beep_(800,2000)
Gruß
Thomas

Verfasst: 21.06.2008 14:36
von Danilo
ts-soft hat geschrieben:ThreadSafe ist aber sowieso sinnlos, wenn keine Strings vorhanden :wink:
Um nochmal kurz darauf zurückzukommen:
Das heißt /THREAD ist *nur* fürs interne Stringhandling da, aber die
Befehle in den Libs sind damit nicht Threadsicher?

Das wäre ja ziemlicher Bull.

Ich habe mich schon gewundert warum das nicht funktioniert:

Code: Alles auswählen

Procedure MyThread(a)
  PrintN("abc_123")
EndProcedure

If OpenConsole()
  For a = 0 to 100
    CreateThread(@MyThread(),0)
  Next a
  Input()
EndIf
Wenn ich Threadsafe anschalte, dann erwarte ich eigentlich das auch
sowas simples wie ein PrintN intern threadsicher gemacht wurde.

Aus der Hilfe zu Threads:

Code: Alles auswählen

PureBasic has a special compiler setting to create threadsafe executables. (/THREAD commandline switch or "create threadsafe executable" in the IDE compiler options). Without this mode, certain functions (and also the string access) are faster, but not save to use in threads. It is still possible to create threads without this mode but it is not recommended, as even something simple like a local string access can be dangerous and needs to be protected. Enabling this option makes these things save inside threads, but comes at the price of some speed.
Das klingt für mich eigentlich so, als wenn dann nicht nur Strings sicher
sind, sondern auch die PB-Befehle.

So muß man ja weiterhin alles selbst absichern und das BASIC nimmt
einem das nicht ab. Ist das korrekt so?

Verfasst: 21.06.2008 14:52
von ts-soft
Einige Libs haben extra Threadsafe Funktionen, aber ich denke mal (d. h.
nicht Wissen) das es bei weitem nicht alle sind.

Antwort können wohl nur Freak oder Fred geben.