Thread darf nicht mit globaler Liste arbeiten!?

Anfängerfragen zum Programmieren mit PureBasic.
es_91
Beiträge: 410
Registriert: 25.01.2011 04:48

Thread darf nicht mit globaler Liste arbeiten!?

Beitrag von es_91 »

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.
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

Re: Thread darf nicht mit globaler Liste arbeiten!?

Beitrag von ts-soft »

Erstelle einen Mutex und Lock die Liste vor dem Zugriff!

Globale Listen oder ähnlich sind doch nicht gegen Threads gefeit :wink: , ganz im Gegenteil.
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
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Re: Thread darf nicht mit globaler Liste arbeiten!?

Beitrag von GPI »

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!
es_91
Beiträge: 410
Registriert: 25.01.2011 04:48

Re: Thread darf nicht mit globaler Liste arbeiten!?

Beitrag von es_91 »

Hallo, ts-soft!

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)

; ...
...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).
Zuletzt geändert von es_91 am 19.09.2014 22:07, insgesamt 4-mal geändert.
es_91
Beiträge: 410
Registriert: 25.01.2011 04:48

Re: Thread darf nicht mit globaler Liste arbeiten!?

Beitrag von es_91 »

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.
Bei mir wird das aktuelle Element nicht geändert, nur abgefragt (über 'IsGadget()'). und die Threadsicherheit habe ich vor einiger Zeit eingeschalten.
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

Re: Thread darf nicht mit globaler Liste arbeiten!?

Beitrag von ts-soft »

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.
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
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!?

Beitrag von NicTheQuick »

Das 'UnlockMutex()' muss natürlich nach das 'ForEver', da das 'LockMutex()' auch vor dem 'ForEach' ist.
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

Re: Thread darf nicht mit globaler Liste arbeiten!?

Beitrag von ts-soft »

NicTheQuick hat geschrieben:Das 'UnlockMutex()' muss natürlich nach das 'ForEver', da das 'LockMutex()' auch vor dem 'ForEach' ist.
Guck mal genau hin, da fehlt ein "Next". Wenn das vor UnlockMutex() kommt, ist das schon okay.
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
es_91
Beiträge: 410
Registriert: 25.01.2011 04:48

Re: Thread darf nicht mit globaler Liste arbeiten!?

Beitrag von es_91 »

Ai, so viele Fehler von mir... :doh:

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. :|
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

Re: Thread darf nicht mit globaler Liste arbeiten!?

Beitrag von ts-soft »

Wenn Du ihn ausführbar machst, bin ich gerne bereit ihn zu testen :wink:

Und bitte mit EnableExplicit wenn es geht :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
Antworten