PB 4.20 Crash mit Option Threadsafe

Hier werden, insbesondere in den Beta-Phasen, Bugmeldungen gepostet. Das offizielle BugForum ist allerdings hier.
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

PB 4.20 Crash mit Option Threadsafe

Beitrag 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?
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
marco2007
Beiträge: 906
Registriert: 26.10.2006 13:19
Kontaktdaten:

Beitrag von marco2007 »

Bestätigt.
Komischer Crash...
Windows 11 - PB 6.03 x64
_________________________________
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Beitrag 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.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag 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]
Bild
Win11 Pro 64-Bit, PB_6.11b1
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Beitrag 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.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Beitrag 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?
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten