• Aucun résultat trouvé

Th´eorie et pratique de la concurrence – Master 1 Informatique TP 3 : Variables de condition en C

N/A
N/A
Protected

Academic year: 2022

Partager "Th´eorie et pratique de la concurrence – Master 1 Informatique TP 3 : Variables de condition en C"

Copied!
2
0
0

Texte intégral

(1)

Th´ eorie et pratique de la concurrence – Master 1 Informatique TP 3 : Variables de condition en C

Les variables de condition

La biblioth`eque Pthreads propose ´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 unmutex.

La premi`ere fonction pthread cond wait est ex´ecut´ee quand le thread appelant veut se mettre

`

a ”dormir”, en attendant qu’une certaine condition sur l’´etat du programme devient vraie. Cette fonction prend comme argument un verrou suppos´e `a ˆetre deja verrouill´e. Elle va en meme temps (de mani`ere atomique) lib´erer le verrou et mettre le thread appelant `a ”dormir”. Quand le thread appelant s’´eveille (`a cause d’un signal envoy´e par un autre thread – voir ci-dessous) la fonc- tionpthread cond wait va reprendre le verrou. Ce comportement particulier pr´evient certaines conditions de course (des access non-prot´eg´ees `a des variables partag´ees). Un code utilisant cette fonction aura donc l’allure suivante :

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 estrecommand´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 lesthreads en attente grˆace `a la fonction :

pthread_cond_broadcast(&verrou);

Notez que les variables de conditions ne peuvent pas ˆetre utilis´ees toutes seules. Il faut les combiner avec des conditions sur l’´etat du programme qui en gros assurent que l’appel `apthread cond wait se fait toujours avant l’appel `apthread cond signal. Par exemple, le code suivant peut faire qu’un des threads reste toujours bloqu´e (pour le moment ignorez les commentaires) :

void foo () {

pthread_mutex_lock(&verrou);

// while (done == 0)

pthread_cond_wait (&varcond,&verrou);

pthread_mutex_unlock(&verrou);

}

void bar () {

pthread_mutex_lock(&verrou);

// done = 1;

pthread_cond_signal (&varcond);

(2)

pthread_mutex_unlock(&verrou);

}

int main() { pthread_t t1,t2;

pthread_create(&t1, NULL, foo, NULL);

pthread_create(&t2, NULL, bar, NULL);

}

Le deuxi`eme thread (qui ex´ecute bar) peut s’ex´ecut´e enti`erement avant le premier (qui ex´ecute foo). Donc, le premier thread ne va ˆetre jamais r´eveill´e. En ajoutant une condition sur une variable partag´ee, montr´ee dans les commentaires ci-dessus, va exclure cette situation.

Exercices

Exercice1: M´emoire partag´ee simple

Reprendre l’exercice 4 du Tp1 en utilisant les variables de conditions pour attendre si le flag est mis `a vrai ou faux.

Exercice2: Probl`eme du bus

Nous consid´eronsN passagers et un bus ayantC places (avecC < N). Le comportement du bus est le suivant :

(a) Il attend que Cpassagers soient mont´es.

(b) Il part

(c) Il attend que lesC passagers soient descendus du bus pour aller de nouveau au point (a).

Le comportement d’un passager est le suivant :

(a’) Il essaie de monter dans le bus, si il y a encore de la place, il peut monter sinon il doit attendre.

(b’) Une fois mont´e dans le bus, il fait le voyage dans le bus.

(c’) Il descend du bus et retourne en (a’).

Repr´esenter ce syst`eme avec des processus concurrents utilisant des verrous et des variables de condition.

Indication :Voil`a une fa¸con possible d’aborder le probl`eme :

— Les passagers pourront `a l’aide d’un compteur partag´e se compter de fa¸con `a savoir combien de passagers sont mont´es dans le bus et combien sont descendus. (Attention `a prot´eger l’acc`es `a ce compteur partag´e grˆace `a un verrou).

— Le dernier passager `a remplir le bus r´eveillera le bus pour lui signaler qu’il est plein.

— Le dernier passager `a descendre du bus r´eveillera le bus pour lui signaler qu’il est vide.

Remarques :Observer diff´erentes ex´ecutions et dire si un passager voulant monter dans le bus n’y arrive jamais. Si c’est le cas, savez-vous d’o`u vient ce probl`eme ? Si ce n’est pas le cas, pouvez expliquer pourquoi ?

Références

Documents relatifs

Modifier le code d´ ej` a ´ ecrit pour les classes Reader, Writer et Main pour qu’elles utilise la classe RWexclusive ` a la place de RWbasic.. Observer le comportement de

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