Page 1 sur 1

CreateSemaphore() CreateMutex()

Publié : lun. 27/juil./2009 20:09
par nico
Salut,

CreateSemaphore() CreateMutex()

Lorsqu'on regarde ces deux API sur MSDN, il est indiqué qu'elle fonctionne à partir de window 2000.

Dans l'aide de Purebasic, c'est indiqué pour tous O.S

Alors ma question est la suivante, ces fonctions fonctionne t'elle sur toutes les versions de window :?:

Publié : lun. 27/juil./2009 21:29
par Thyphoon
reste plus qu'a tester sur les OS. Moi j'ai toujours pas compris l'intérêt de ces fonctions ... je sais honte a moi ... :oops: je te proposerais bien de t'aider , mais le plus vieux OS que j'ai est XP :(

Publié : mar. 28/juil./2009 8:50
par poshu
Ces fonctions ne servent que si tu multithread ton programme (pour éviter d'avoir des comportements "étranges" voir des gros crash en cas d'accès simultanés à des ressources); si tu multithread pas, tu t'en fout.

Publié : mar. 28/juil./2009 8:54
par Thyphoon
poshu a écrit :Ces fonctions ne servent que si tu multithread ton programme (pour éviter d'avoir des comportements "étranges" voir des gros crash en cas d'accès simultanés à des ressources); si tu multithread pas, tu t'en fout.
Merci pour ces precision ... :)

Publié : mar. 28/juil./2009 9:53
par lionel_om
Exemple basic:

Thread 1 produit qqchose, et Thread 2 consomme.

Code : Tout sélectionner

Declare GetRessourceQuantity()
Declare SetRessourceQuantity(nb)

; Thread 1
Procedure Produit(nb.l)
  val = GetRessourceQuantity()
  SetRessourceQuantity( val + nb )
EndProcedure

; Thread 2
Procedure Consomme(nb.l)
  val = GetRessourceQuantity()
  SetRessourceQuantity( val - nb )
EndProcedure
Le corps des fonctions ne sera pas execute en une seule instruction ASM, donc un thread peut rendre la main a l'autre pendant l'execution de cette simple procedure.

cas de figure: production de 5 elements, consommation de 3 elts. Declenchement quasi instantane.
Thread 1, recupere la valeuer dans "val" (disons que 'val' vaut 10), puis il passe la main a Thread2 qui recupere cette valeur aussi et qui repasse la main.
Ensuite le SetRessQty() est execute dans les deux cas:
Thread1 : si on rappelle GetRessourceQuantity() on obtient : 10 + 5 = 15
Thread2 : si on rappelle GetRessourceQuantity() on obtient : 10 - 3 = 7, car on fait bien la soustraction de 10 et de 3. La mise a jour precedente a ete ignoree et les 5 ressources produites ont disparue...
Et ca peut egalement ce passer si on avait tout reduit en une ligne:

Code : Tout sélectionner

SetRessourceQuantity( GetRessourceQuantity() +/- nb )
.

/Liå :wink: