Sempahores

Vous avez une idée pour améliorer ou modifier PureBasic ? N'hésitez pas à la proposer.
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Sempahores

Message par lionel_om »

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 :

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)
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 :

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)
Plus logique quand même non ???

Lio :?: :!:
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
poshu
Messages : 1138
Inscription : sam. 31/juil./2004 22:32

Message par poshu »

Bon, un vieux réflexe de lolcat a voulu me faire hurler NEEEED MOAAAAAAR!, mais je vais me contanter de dire que les semaphores, c'est juste trop amour dedans leurs corps et que j'en ai véritablement besoin...
Alors en ce moment, je perds mon temps à coder un système de sémaphore forcément moins optimisé que si fred le faisait, et j'aimerais bien les voir pointer leurs nez dans les prochaines versions. Avec les quadcore, le multithreading c'est un peu obligatoire...
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

Freak se demandait s'il allait ajouter les sémaphores pour la 4.30; à suivre !

http://www.purebasic.fr/english/viewtopic.php?t=30873
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
poshu
Messages : 1138
Inscription : sam. 31/juil./2004 22:32

Message par poshu »

Merci de l'info comtois. Ca serait très très bien.
Répondre