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:
.
/Liå
