WaitSemaphore()

Syntaxe

WaitSemaphore(Semaphore)
Description
Diminue la valeur du compteur interne du sémaphore de un, ce qui a pour effet de bloquer le thread, si la valeur venait à tomber en dessous de zéro. Le thread sera débloqué dès qu'un autre thread appellera SignalSemaphore().

Arguments

Semaphore Le sémaphore à attendre.

Valeur de retour

Aucune.

Remarques

Le compteur maximal d'un sémaphore est limité à une valeur 32-bit signée, donc un maximum de 2147483647 appels à WaitSemaphore() peuvent être effectués sans être contre-balancés par des appels à SignalSemaphore().

Exemple

  ; Assurez vous que l'option "Activer la gestion des threads" est sélectionnée
  ;
  Global Semaphore = CreateSemaphore()
  Global Mutex     = CreateMutex()
  Global NewList Queue()

  Procedure Producer(Total)

    For i = 1 To Total
      Delay(Random(750) + 250)
    
      ; L'accès à la liste nécessite tout de même un mutex pour être threadsafe
      LockMutex(Mutex)
        LastElement(Queue())
        AddElement(Queue())
        Queue() = i
      UnlockMutex(Mutex)    

      ; Envoie un signal pour indiquer qu'un nouvel élément est disponible
      SignalSemaphore(Semaphore)
    Next i
    
  EndProcedure

  If CreateThread(@Producer(), 30)

    For i = 1 To 30  
      ; Attente d'un nouvel élément
      WaitSemaphore(Semaphore)
    
      ; Affiche l'état de la liste
      LockMutex(Mutex)
        Queue$ = "Queue:"
        ForEach Queue()
          Queue$ + " " + Str(Queue())
        Next Queue()
        Debug Queue$
    
        ; Efface le premier élément de la liste
        FirstElement(Queue())
        DeleteElement(Queue())
      UnlockMutex(Mutex)
    
    Next i

  EndIf

Voir aussi

SignalSemaphore(), TrySemaphore()

OS Supportés

Tous

<- UnlockMutex() - Thread Index - WaitThread() ->