• Aucun résultat trouvé

Th´eorie et pratique de la concurrence – Master 1 Informatique TP 4 : Programmation concurrente en C (suite)

N/A
N/A
Protected

Academic year: 2022

Partager "Th´eorie et pratique de la concurrence – Master 1 Informatique TP 4 : Programmation concurrente en C (suite)"

Copied!
3
0
0

Texte intégral

(1)

Th´eorie et pratique de la concurrence – Master 1 Informatique TP 4 : Programmation concurrente en C (suite)

Les mutexs

Les mutexs sont des s´emaphores binaires (ne pouvant prendre que la valeur 0 ou 1) de la biblioth`eque Pthreads. On les appelle ´egalement verrous. Pour les utiliser, il faut inclure la bi- blioth`eque :

#include <pthread.h>

La d´eclaration d’un mutex se fait de la fa¸con suivante :

pthread_mutex_t verrou;

Pour initialiser unmutex, on proc`ede comme suit :

pthread_mutex_init (&verrou , NULL);

Le premier argument correspond au verrou que l’on souhaite initialiser, quand au second, qui est mis `aNULL, il pr´ecise les attributs du verrou.

Pour ”prendre un verrou” (i.e. faire P sur le verrou), on fait :

pthread_mutex_lock (&verrou);

Et pour le lib´erer :

pthread_mutex_unlock (&verrou);

Par cons´equent, une section critique pourra ˆetre faite de la fa¸con suivante :

pthread_mutex_lock (&verrou);

/*section critique*/

pthread_mutex_unlock(&verrou);

Les variables de condition

La biblioth`equePthreadspropose ´egalement un autre outil de synchronisation entre processus que l’on appelles les variables de condition. Une variable de condition est d´eclar´ee comme suit :

pthread_cont_t (varcond);

Pour l’initialiser, on proc`ede ainsi :

pthread_cond_init (&vacond,NULL);

Pour utiliser les variables conditionnelles, on dispose de trois fonctions qui doivent ˆetre appel´ees au sein d’une section critique cr´e´ee grˆace `a un mutex. La premi`ere fonction bloque le thread appelant et lib`ere le verrou. Lorsque lethread bloqu´e est ensuite r´eveill´e, il reprend la main sur le verrou. Elle s’appelle de la fa¸con suivante :

pthread_cond_wait (&varcond,&verrou);

Le deuxi`eme argument correspond aumutexutilis´e pour la section critique. Un code utilisant cette fonction aura donc l’allure suivante :

(2)

pthread_mutex_lock(&verrou);

pthread_cond_wait (&varcond,&verrou);

pthread_mutex_unlock(&verrou);

Pour r´eveiller unthread bloqu´e sur une variable de condition, un autre thread peut faire :

pthread_cond_signal(&varcond);

L`a aussi il est recommand´ed’appeler cette fonction au sein d’une section critique prot´eg´ee par lemutex utilis´e par le thread en attente (dans l’exemple pr´ec´edent il s’agit dumutex verrou).

On peut aussi r´eveiller tous lesthreadsen attente grˆace `a la fonction :

pthread_cond_broadcast(&verrou);

IMPORTANT : Pour compiler vos programmes, n’oubliez pas de mettre l’option -lpthread

Vous trouverez un exemples de programmes utilisant les fonctionnalit´es pr´esent´ees sur la page web des TD/TP :

http://www.liafa.jussieu.fr/~sangnier/enseignement/concurrence.html

Exercices

Exercice1: Salle de bain unisexe

Supposez qu’on dispose d’une seule salle de bain qui peut ˆetre utilis´ee par des hommes ou des femmes mais pas au mˆeme moment.

1. Programmez en utilisant les s´emaphores une solution `a ce probl`eme. Il faut permettre un nombre quelconque d’hommes OU de femmes ˆetre dans la salle de bain au mˆeme moment.

La solution doit assurer l’exclusion mutuelle demand´ee et l’absence d’inter-blocage.

2. Modifiez votre solution pour permettre au plus 4 personnes (du mˆeme sexe) en mˆeme temps.

3. On souhaite maintenant garantir qu’il y aura une alternance entre hommes et femmes (si il y a r´eguli`erement des hommes et des femmes qui font la queue). Pour cela, d´eveloppez une solution qui laisse au plus entrer 4 femmes [respectivement 4 hommes] dans la salle de bains, si un homme [resp. une femme est en train d’attendre].

Exercice2: Programmation des s´emaphores avec les variables de condition Dans cet exercice il vous est demand´e de programmer vos propres s´emaphores. Pour ce faire, vous pouvez cr´eer un type s´emaphore de la forme suivante :

typedef struct sema pthread_mutex_t verrou;

pthread_cond_t varcond;

int compteur;

semaphore;

Intuitivement le verrou sert `a prot´eger la valeur du compteur associ´ee au s´emaphore et la variable de condition est utilis´ee pour bloquer les threads qui tentent de prendre le s´emaphore alors que la valeur du compteur est `a 0.

1. Programmez les fonctions int semaphore_init(semaphore *sem,int val), int semaphore_post(seamphore *sem) et int semaphore_wait(semaphore *sem) de ce s´emaphore (qui correspondent aux fonction ´equivalentes pour les s´emaphore de la librairePthreads).

(3)

2. Testez votre version des s´emaphores en les utilisant pour le premier exercice du TP pr´ec´edent.

Exercice3: Probl`eme de la liste partag´ee

Des voitures arrivant du nord ou du sud doivent passer un pont `a voie unique. Les voitures ayant la mˆeme direction peuvent passer le pont au mˆeme moment, mais les voitures ayant des directions oppos´ees ne le peuvent pas.

1. Programmez le code des processus voiture, ainsi que le code n´ecessaire `a leur synchronisation.

Références

Documents relatifs

Dans ce Tp on impl´ ementera quelques algorithmes d’exclusion mutuelle sans utiliser les prim- itives de haut niveau comme les m´ ethodes synchronized ou les variables de

Le serveur stocke alors cette chaˆıne de caract` eres dans un objet de type ConcurrentBuffer Un client consommateur attend que le serveur lui envoie des chaˆınes de caract` eres qui

Le premier argument est l’adresse d’un descripteur de thread, le deuxi`eme argument (que nous mettrons toujours ` a NULL dans ces TP) est un attribut de thread de type pthread_attr_t

Dans cet exercice on souhaite mod´eliser ce probl`eme du dˆıner des philosophes par un programme en C dans leque chaque baguette sera repr´esent´ee par un verrou et chaque

L`a aussi il est recommand´ e d’appeler cette fonction au sein d’une section critique prot´eg´ee par le mutex utilis´e par le thread en attente (dans l’exemple pr´ec´edent

La premi`ere n’autorisera pas un consommateur ` a lire une nouvelle donn´ee tant que la derni`ere donn´ee lue n’aura pas ´et´e vue par tous les consommateurs (le dernier

Les paniers et les cabines seront repr´esent´es par deux s´emaphores semCabine et semPanier qui seront des champs de la classe Client (ces s´emaphores seront partag´es par tous

Supposez qu’on dispose d’une seule salle de bain qui peut ˆetre utilis´ee par des hommes ou des femmes mais pas au mˆeme moment.. Programmez en utilisant les s´emaphores une