:: Enseignements :: ESIPE :: E4INFO :: 2009-2010 :: Java Réseau I - Concurrence et E/S ::
![[LOGO]](http://igm.univ-mlv.fr/ens/resources/mlv.png) | TP noté de Concurrence |
Attention : l'emploi de verrou doit permettre de rendre thread-safe tout code pouvant poser un problème de concurrence mais ne doit pas être utiliser inutilement.
Exercice 1 - Fonction mystère
On souhaite calculer en parallèle les 6 premières valeurs (de 0 à 5) du développement limité de cos(1) grâce à la fonction mystere (i.e. mystere(0), mystere(1), mystere(2) ... mystere(5)). On ne cherchera pas à comprendre le fonctionnement de cette dernière.
-
Ecrire une première version du programme déléguant le calcul de mystere(i) pour i allant de 0 à 5 à six threads. Chaque thread affichera le résultat de l'appel à la fonction mystere (à savoir la ième valeur du développement limité de cos(1)). L'ordre d'affichage n'a pas d'importance.
-
On souhaite maintenant n'avoir que 3 threads exécutant les six calculs en parallèle. L'ordre d'affichage n'a toujours pas d'importance.
-
Ecrire une nouvelle version qui comme la version précédente utilise uniquement 3 threads, effectue les calculs en parallèle mais affiche les résultats dans l'ordre croissant de i; à savoir : mystere(0), mystere(1), ... mystere(5).
Exercice 2 - C'est ma fort
Le but de cet exercice est d'écrire le code d'un sémaphore d'un type un peu particulier
nommé
StealSemaphore.
Vous avez le droit d'utiliser toutes les classes que vous voulez sauf la classe
java.util.concurrent.Semaphore.
Voici les opérations disponibles sur ce sémaphore:
-
Un constructeur qui permet de spécifier le nombre de permis disponibles au démarrage de la sémaphore.
-
Une méthode acquire prenant un nombre de permis en paramètre et permettant à la thread courante d'acquérir ces permis. Si il n'y a pas assez de permis disponibles, la thread courante doit attendre jusqu'à ce qu'il y est assez de permis. Si deux threads sont en attente et qu'il y a le bon nombre de permis pour les deux, la première thread qui prend les permis doit être la thread qui a attendu le plus longtemps (attention, ne réinventez pas la roue).
-
Une méthode releaseAll qui redonne tous les permis pris par la thread courante. Cette méthode doit marcher même si la thread courante n'a pas pris de permis, dans ce cas l'opération est équivalente à considérer que la thread courante possède zéro permis.
On cherche maintenant à ajouter une méthode
steal à notre classe
StealSemaphore. Cette méthode est bloquante lorsqu'une première thread appelle cette méthode. Si une seconde thread appelle cette même méthode, alors la première thread est débloquée et une des deux threads doit s'emparer de tous les permis de l'autre thread (cela veut dire que l'autre thread ne possède plus de permis). Le fait de savoir quelle thread a pris les permis à l'autre est non spécifié.i (voir du côté du package java.util.concurrent pour se faciliter la manoeuvre d'échange ... ).
© Université de Marne-la-Vallée