Sempahores
Publié : jeu. 13/mars/2008 19:54
Il n'y a pas de sémaphore dans PB. C'est assez dommage car c'ess bien pratique et que les Mutex sont trop restreints : LockMutex() ne vérrouille pour le Mutex donné que le Thread lançant cet appel. Par là je veut dire que placer autant de fois "LockMutex()" d'affiler dans un programme ne bloquera pas son exécution.
C'est assez dommage (mais c'est le principe des Mutex de L'API Windows également), car si on veut que le programme principale soit bloqué jusqu'à ce qu'un Thread qui vient d'être créé soit totalement initialisé (ou ai effectué une action), ça ne marche pas...
Voici un exemple :
La fonction CreateMutex de l'API de Windows provoque la même exécution. Pour contourner ces restrictions il faut passer par des sémaphores. Il ne sont pas natifs dans PB. DOMMAGE !!!
Voici le mm code, mais avec des Semaphores :
Plus logique quand même non ???
Lio

C'est assez dommage (mais c'est le principe des Mutex de L'API Windows également), car si on veut que le programme principale soit bloqué jusqu'à ce qu'un Thread qui vient d'être créé soit totalement initialisé (ou ai effectué une action), ça ne marche pas...
Voici un exemple :
Code : Tout sélectionner
Global m = CreateMutex()
Procedure Thread(void)
Debug "Thread is running"
Delay(Random(3)*100)
Debug "< < <"
UnlockMutex(m)
EndProcedure
Procedure LaunchTread()
LockMutex(m)
Debug "> > >"
t = CreateThread(@Thread(), 0)
EndProcedure
For i = 1 To 5
LaunchTread()
Next i
Delay(1000)
Voici le mm code, mais avec des Semaphores :
Code : Tout sélectionner
;------------------- Semaphore Functions ------------------------
Macro Sem_Create(Init, Max)
CreateSemaphore_(#Null, Init, Max, #Null)
EndMacro
Macro Sem_Acquire(Sem)
WaitForSingleObject_(Sem, #INFINITE)
EndMacro
Macro Sem_ReleaseSeveral(Sem, nb)
ReleaseSemaphore_(Sem, nb, #Null)
EndMacro
Macro Sem_Release(Sem)
ReleaseSemaphore_(Sem, 1, #Null)
EndMacro
;---------------- End of Semaphore Functions ---------------------
Global m = Sem_Create(1, 1)
Procedure Thread(void)
Debug "Thread is running"
Delay(Random(3)*100)
Debug "< < <"
Sem_Release(m)
EndProcedure
Procedure LaunchTread()
Sem_Acquire(m)
Debug "> > >"
t = CreateThread(@Thread(), 0)
EndProcedure
For i = 1 To 5
LaunchTread()
Next i
Delay(1000)
Lio

