Thread darf nicht mit globaler Liste arbeiten!?
Thread darf nicht mit globaler Liste arbeiten!?
Hi.
Also ich habe da einen Thread, der auf eine globale, vor dem Threadstart definierte, strukturierte verknüpfte Liste zugreift. Manchmal geht alles gut. Doch manchmal hängt sich mein Programm auf und es wird im Hauptprogramm ein Fehler gebracht, die verknüfte Liste hätte kein aktuelles Element. Und das, obwohl ich nirgendswo einen DeleteElement()-Befehl verwende!
Wie kann das sein? Habt Ihr irgendwelche Erfahrungen mit so einer Situation gemacht? Könnt Ihr Hilfestellungen geben?
Dankend,
euer es_91.
Also ich habe da einen Thread, der auf eine globale, vor dem Threadstart definierte, strukturierte verknüpfte Liste zugreift. Manchmal geht alles gut. Doch manchmal hängt sich mein Programm auf und es wird im Hauptprogramm ein Fehler gebracht, die verknüfte Liste hätte kein aktuelles Element. Und das, obwohl ich nirgendswo einen DeleteElement()-Befehl verwende!
Wie kann das sein? Habt Ihr irgendwelche Erfahrungen mit so einer Situation gemacht? Könnt Ihr Hilfestellungen geben?
Dankend,
euer es_91.
- 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
Re: Thread darf nicht mit globaler Liste arbeiten!?
Erstelle einen Mutex und Lock die Liste vor dem Zugriff!
Globale Listen oder ähnlich sind doch nicht gegen Threads gefeit
, ganz im Gegenteil.
Globale Listen oder ähnlich sind doch nicht gegen Threads gefeit

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.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Re: Thread darf nicht mit globaler Liste arbeiten!?
Die Compiler-Option für threadsichere Routinen kann auch hilfreich sein. Hilft natürlich nicht, wenn gleichzeitig das aktuelle Element geändert wird.
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Re: Thread darf nicht mit globaler Liste arbeiten!?
Hallo, ts-soft!
Mache ich da etwas falsch?
...es geht nämlich immer noch nicht.
/EDIT: Code geändert! (Global-Definition für 'iMutex' hinzugefügt)
/EDIT4: 'Next' eingefügt (siehe weiter unten).
Mache ich da etwas falsch?
Code: Alles auswählen
Global Newlist iListe. i()
Global iMutex. i
Procedure THREAD(Void. i)
Repeat
Delay(1)
LockMutex (iMutex)
ForEach iListe ()
If IsGadget (iListe ())
Break
EndIf
Next
UnlockMutex (iMutex)
ForEver
EndProcedure
AddElement (iListe ())
iMutex = CreateMutex ()
iThread = CreateThread (@ THREAD(), #Null)
; ...
/EDIT: Code geändert! (Global-Definition für 'iMutex' hinzugefügt)
/EDIT4: 'Next' eingefügt (siehe weiter unten).
Zuletzt geändert von es_91 am 19.09.2014 22:07, insgesamt 4-mal geändert.
Re: Thread darf nicht mit globaler Liste arbeiten!?
Bei mir wird das aktuelle Element nicht geändert, nur abgefragt (über 'IsGadget()'). und die Threadsicherheit habe ich vor einiger Zeit eingeschalten.GPI hat geschrieben:Die Compiler-Option für threadsichere Routinen kann auch hilfreich sein. Hilft natürlich nicht, wenn gleichzeitig das aktuelle Element geändert wird.
- 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
Re: Thread darf nicht mit globaler Liste arbeiten!?
Globale Mutexvar am Anfang des Codes, vor Threadprocedure.
Lock mutex bei nutzung der Liste, im Thread oder im Mainprogramm!
Unlockmutex danach, also immer schön freigeben.
Die CompilerOption Threadsafe ist empfehlenswert, die Macht die Strings Threadsicher,
d. h. zum Beispiel auch Strings in Listen.
Lock mutex bei nutzung der Liste, im Thread oder im Mainprogramm!
Unlockmutex danach, also immer schön freigeben.
Die CompilerOption Threadsafe ist empfehlenswert, die Macht die Strings Threadsicher,
d. h. zum Beispiel auch Strings in Listen.
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.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

- NicTheQuick
- Ein Admin
- Beiträge: 8809
- Registriert: 29.08.2004 20:20
- Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti - Wohnort: Saarbrücken
Re: Thread darf nicht mit globaler Liste arbeiten!?
Das 'UnlockMutex()' muss natürlich nach das 'ForEver', da das 'LockMutex()' auch vor dem 'ForEach' ist.
- 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
Re: Thread darf nicht mit globaler Liste arbeiten!?
Guck mal genau hin, da fehlt ein "Next". Wenn das vor UnlockMutex() kommt, ist das schon okay.NicTheQuick hat geschrieben:Das 'UnlockMutex()' muss natürlich nach das 'ForEver', da das 'LockMutex()' auch vor dem 'ForEach' ist.
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.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Re: Thread darf nicht mit globaler Liste arbeiten!?
Ai, so viele Fehler von mir... 
Aber was habe ich denn nun eigentlich falsch gemacht? Mein Code demonstriert doch, so wie ich es sehe, genau das, was ts-soft mir geraten hat.

Aber was habe ich denn nun eigentlich falsch gemacht? Mein Code demonstriert doch, so wie ich es sehe, genau das, was ts-soft mir geraten hat.

- 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
Re: Thread darf nicht mit globaler Liste arbeiten!?
Wenn Du ihn ausführbar machst, bin ich gerne bereit ihn zu testen
Und bitte mit EnableExplicit wenn es geht

Und bitte mit EnableExplicit wenn es geht

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.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
