Verfasst: 25.01.2007 22:38
Ich habe auch nochmal einen Code gebastelt, hatte nur etwas gedauert.
Dieser nutzt kein Mutex, die Variable b ist aber "threadsicher", also geschützt. es gibt keine Probleme beim beschreiben oder so.
Allerdings ist der Programmaufbau nicht "threadsicher" wenn du dir die Ausgabe ansiehst, wird dir auffallen, das nicht immer "thread1: 1" oder "thread2: 2" ausgegeben wird wie es laut code sollte, sondern die Werte nach Lust und Laune wechseln.
Willst du den Code thread sicher machen, dann mußt es es in der Art machen wie es remi_meier gepostet hat. in Punkt auf meine Code so:
Code: Alles auswählen
Global b.l
Global wait.b
Procedure thread1(d)
While wait = 0
Wend
For i = 1 To 10
b = 1
test.s = Space(1000000)
Debug "thread1: " + Str(b)
Next
EndProcedure
Procedure thread2(d)
wait = 1
Delay(0)
For i = 1 To 10
b = 2
test.s = Space(1000000)
Debug "thread2: " + Str(b)
Next
EndProcedure
CreateThread(@thread1(),0)
Delay(1500)
CreateThread(@thread2(),0)
Delay(10000)
Allerdings ist der Programmaufbau nicht "threadsicher" wenn du dir die Ausgabe ansiehst, wird dir auffallen, das nicht immer "thread1: 1" oder "thread2: 2" ausgegeben wird wie es laut code sollte, sondern die Werte nach Lust und Laune wechseln.
Willst du den Code thread sicher machen, dann mußt es es in der Art machen wie es remi_meier gepostet hat. in Punkt auf meine Code so:
Code: Alles auswählen
Debug "start"
Global Mutex1 = CreateMutex()
Global Mutex2 = CreateMutex()
Global b.l
Global wait.b
Procedure thread1(d)
While wait = 0
Wend
For i = 1 To 10
LockMutex(Mutex1)
b = 1
test.s = Space(1000000)
Debug "thread1: " + Str(b)
UnlockMutex(Mutex1)
Next
EndProcedure
Procedure thread2(d)
wait = 1
Delay(0)
For i = 1 To 10
LockMutex(Mutex1)
b = 2
test.s = Space(1000000)
Debug "thread2: " + Str(b)
UnlockMutex(Mutex1)
Next
EndProcedure
LockMutex(Mutex2) ; dieser Zweite Mutex arbeitet unabhängig vom ersten, wenn nicht, dann würde in den Threads nun nichts ausgeführt werden
;LockMutex(Mutex1) ; dies ist der selbe Mutex wie in den Threads, die dadurch nicht weiter arbeiten
CreateThread(@thread1(),0)
Delay(1500)
CreateThread(@thread2(),0)
Delay(10000)