Basic Univers
Global var
Global quit
Global mutexVar, mutexQuit, mutexDebug
Global threadPlus, threadMoins
Procedure Moins()
Repeat
WaitForSingleObject_(mutexVar, 0)
var - 1
WaitForSingleObject_(mutexDebug, 0)
Debug "MOINS! " + Str(var)
ReleaseMutex_(mutexDebug)
ReleaseMutex_(mutexVar)
WaitForSingleObject_(mutexQuit, 0)
If quit = #True
ReleaseMutex_(mutexQuit)
WaitForSingleObject_(mutexDebug, 0)
Debug "Arret de Moins"
ReleaseMutex_(mutexDebug)
ProcedureReturn
EndIf
ReleaseMutex_(mutexQuit)
ForEver
EndProcedure
Procedure Plus()
Repeat
WaitForSingleObject_(mutexVar, 0)
var + 1
WaitForSingleObject_(mutexDebug, 0)
Debug "PLUS! " + Str(var)
ReleaseMutex_(mutexDebug)
ReleaseMutex_(mutexVar)
WaitForSingleObject_(mutexQuit, 0)
If quit = #True
ReleaseMutex_(mutexQuit)
WaitForSingleObject_(mutexDebug, 0)
Debug "Arret de Plus"
ReleaseMutex_(mutexDebug)
ProcedureReturn
EndIf
ReleaseMutex_(mutexQuit)
ForEver
EndProcedure
mutexVar = CreateMutex_(0, 0, 0)
mutexQuit = CreateMutex_(0, 0, 0)
mutexDebug = CreateMutex_(0, 0, 0)
If(mutexVar And mutexQuit And mutexDebug) = #False
Debug "Pas de mutex"
End
EndIf
threadPlus = CreateThread(@Plus(), 0)
threadMoins = CreateThread(@Moins(), 0)
If(threadPlus And threadMoins) = #False
Debug "Pas de thread"
End
EndIf
OpenWindow(0, 0, 0, 256, 0, #PB_Window_SystemMenu, "Fermeture")
Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow
WaitForSingleObject_(mutexQuit, 0)
quit = #True
ReleaseMutex_(mutexQuit)
WaitThread(threadPlus)
WaitThread(threadMoins)
CloseHandle_(mutexVar)
CloseHandle_(mutexQuit)
CloseHandle_(mutexDebug)