Le Coin Wiki
d'Olivier Dalle
$WikiTagline
 

Programmation Concurrente - Sance de TP7

Ce petit TP a pour objectif de faire decouvrir l’utilisation des Atomic Variables du package java.util.concurrent et l’utilisation de ce type de variables afin de concevoir des algorithmes multi-thread concurrent mais sans blocage et donc essentiellement bases sur de l’attente active et des tests (par opposition aux algorithmes utilisant de l’attente passive, grace a verrous, moniteurs ou semaphores).

1.  Compare and Set (CAS) ou Test and Set (TAS) ?

Le principe des Atomic Variable repose sur CAS et non TAS. Il est donc important de differencier les 2 !

  • Commencer par etudier la semantique precise de la methode CAS que l’on invoque sur un objet de type AtomicVariable, et que l’on peut resumer ainsi The boolean compareAndSet(expectedValue, updateValue) method says “Update this variable to this new value (updateValue), but fail if some other thread changed the value since I last looked (i.e. is not equal to expectedValue).”. Pour bien comprendre, s’aider de la JavaDoc correspondante et de cet article tres instructif
  • Reprendre la definition de l’instruction TAS appliquee sur une variable (rappelez-vous, TAS etait utilise notamment pour resoudre l’exclusion mutuelle, et utilisait donc une variable globale verrou).

Ecrire (sur papier) avec CAS, comment se traduirait l’utilisation que nous avions faite de TAS sur la variable globale verrou initialement mise a la valeur 0.

  • Implanter avec l’aide de CAS et d’attente uniquement active, les operations habituelles entrerSC et sortirSC.
  • Tester cette nouvelle implantation pour resoudre l’exclusion mutuelle. Par exemple, partir de l’exercice du TP2 mais au lieu de resoudre l’exclusion mutuelle avec l’algo de Peterson, la resoudre avec votre version utilisant CAS.

2.  Compare and Set (CAS) applique a la mise en place d’une variable compteur

  • Reprendre l’exercice d’incrementation ou decrementation du compteur de la part de 2 threads de type Inc et 2 threads de type Dec. La version entrelacant ces 4 threads sans aucune precaution pouvait mener a des incoherences dans la valeur finale du compteur. Version de depart, qui selon les systemes d’exploitation, meme eventuellement a des incoherences

Proposer une implantation des methodes d’incrementation et de decrementation, qui meme sans utiliser d’exclusion mutuelle pour l’acces a la variable commune, permet d’eviter les incoherences.

  • Enlever tous les affichage ecran, et ce, afin de comparer les performances des 2 versions (l’une qui utilise un synchronized pour les methodes incX et decX, l’autre qui se fonde sur attente active et CAS).