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)