Vorab:
Wenn du ein "ganzes Module" sperren willst, also mit einem Mutex den parallelenzugriff verhindern willst, dann ist es ja trivial gesagt quatsch überhaupt einen Thread in diesem Modul zu nutzen, da er ja dann eh Nacheinander läuft.
Nun zu deinen konkreten Fragen:
>> "Reicht für so etwas ein im Modul globales Mutex aus?"
Nein, aus dem einfachen Grund, da es ja dann kein Sinn macht einen Thread zu nutzen.
>> "Könnte es Probleme verursachen, wenn LockMutex() mehrfach aufgerufen wird?"
Das ist leider nicht sicher. So kommt es durchaus zu unterschiedlichen Verhalten je nach Betriebssystem.
Unter Windows musst du dann zB genauso viele Unlocks im Thread aufrufen wie Locks damit an anderer Thread wieder arbeitet:
Code: Alles auswählen
Global Mutex = CreateMutex()
Procedure Test(Void)
LockMutex(Mutex)
Debug "Procedure"
UnlockMutex(Mutex)
EndProcedure
Debug "Lock Main"
LockMutex(Mutex)
CreateThread(@Test(), 0)
Delay(100)
Debug "Lock Main"
LockMutex(Mutex)
Delay(100)
Debug "Unlock Main"
UnlockMutex(Mutex)
Delay(100)
Debug "Unlock Main"
UnlockMutex(Mutex)
Delay(100)
Ich glaube unter Linux ist das anders.
>> "ist ein Mutex 100% sicher?"
Ja!
Nachtrag:
Wenn du mit Listen arbeiten willst, kannst du für den Thread auch eine Pointer-Liste zur echten Liste erstellen.
So kann der Thread seine eigene Liste durchlaufen dann aber auf die selben Elemente zugreifen.
Je nachdem was du dann genau machst, musst du dann nur den Element-Zugriff selbst sichern.
Leider kann man nicht "mach mal meine Thread sicher" aufrufen. Leider ist man dazu gezwungen, sich sehr intensiv mit der Dynamik des Codes zu befassen, um günstige Stellen zu finden, an denen man Locked und Unlocked.
Wenn du im Main ein Element löschst, darf der Thread natürlich nicht gerade drauf zugreifen -> Absturtz.
Try&Error geht beim einbauen von Lock/Unlock auch nicht -> Instabilitäten
Mutex sollten auch wenns geht nicht vor einer Intensiven Berechnung gesperrt werden, da ja dann alles andere auf die Berechnung wartet. LockMutex also lieber in der Schleife, statt außen.
So kannst du bei Listen zB auch mit PushListPosition() und PopListPosition() arbeiten umd die Elemente zu merken.