Mutex Thread LinkedList Fehler
Verfasst: 16.08.2013 20:27
Hi Leute,
mich quält nun schon seit einiger Zeit ein mieser Fehler. Da er in einem recht großen Projekt auftritt, und zudem auch noch sehr sporadisch und zufällig, konnte ich die Ursache lange Zeit nicht finden. Nun kann es sein, dass ich ihm nun etwas auf die Schliche gekommen bin. Allerdings ist immer noch sehr viel Zufall im Spiel, alles sehr strange. Hier man ein kleiner Testcode, der den Fehler erzeugt:
Es werden ständig neue Events in eine Liste gepackt (ich richtigen Programm sind es Usereingaben), die ein Thread dann ausliest. Irgendwann friert das Fenster ein, und es passiert gar nichts. Der Debugger kann mir auch nicht mehr sagen, wo ich gerade bin. Das passiert aber auch nur manchmal. Also lasst es ein paar mal laufen, vielleicht auch mit einem kleineren Wert bei Random (z.b. 3 oder 4). Allerdings tauchte bei mir der Fehler auch mal auf, als ich dort 20 stehen hatte. Ich kann nicht erkennen, dass ich dort irgendwelche Deadlocks produziere.
Bei Tests im Originalprogramm habe ich noch merkwürdigere Dinge erlebt, in dem der Programmfluss komplett unkontrolliert wurde. So kam es dann dazu, dass "Test1" ausgegeben wurde, "Test2" aber nicht, obwohl dazwischen nur eine einfache Zuweisung stand:
Ich hoffe, ihr könnt den Fehler bestätigen.
PB: 5.11 / 5.20 Beta, 32 Bit, Threadsafe aktiviert
lg Kevin
mich quält nun schon seit einiger Zeit ein mieser Fehler. Da er in einem recht großen Projekt auftritt, und zudem auch noch sehr sporadisch und zufällig, konnte ich die Ursache lange Zeit nicht finden. Nun kann es sein, dass ich ihm nun etwas auf die Schliche gekommen bin. Allerdings ist immer noch sehr viel Zufall im Spiel, alles sehr strange. Hier man ein kleiner Testcode, der den Fehler erzeugt:
Code: Alles auswählen
Global NewList event.i()
Global mutex = CreateMutex()
Procedure TestThread(hallo)
Repeat
LockMutex(mutex)
If NextElement(event())
DeleteElement(event())
AddGadgetItem(0, 0, "Event "+Str(ElapsedMilliseconds()))
EndIf
UnlockMutex(mutex)
Delay(10)
ForEver
EndProcedure
Procedure Main()
OpenWindow(0, 0, 0, 200, 400, "Test", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
ListViewGadget(0, 0, 0, 200, 400)
CreateThread(@TestThread(), 0)
Repeat
event = WaitWindowEvent(10)
If (event = #PB_Event_CloseWindow)
quit = #True
EndIf
If (Random(5) = 0) ; <-- hier Wert verkleinern, falls kein Fehler auftritt
LockMutex(mutex)
AddElement(event())
ResetList(event())
UnlockMutex(mutex)
EndIf
Until (quit)
EndProcedure
Main()
Bei Tests im Originalprogramm habe ich noch merkwürdigere Dinge erlebt, in dem der Programmfluss komplett unkontrolliert wurde. So kam es dann dazu, dass "Test1" ausgegeben wurde, "Test2" aber nicht, obwohl dazwischen nur eine einfache Zuweisung stand:
Code: Alles auswählen
Debug "Test1"
c = d
Debug "Test2"
PB: 5.11 / 5.20 Beta, 32 Bit, Threadsafe aktiviert
lg Kevin