TP n°4 : Les conditions de synchronisation

Les conditions de synchronisation

Présentation

Nous avons présenté dans le cours les régions critiques basées sur l'attente d'une condition de synchronisation :

région p quand (condition)
    région critique
fin de région

La région critique est exécutée en exclusion mutuelle (sur p) si la condition est respectée. Les threads Linux implantent cette fonction avec les pthread_cond_t. Ces conditions s'utilisent toujours avec un verrou (pthread_mutex_t).

Un exemple

Un extrait de <pthread.h>
// Initialisation d'une condition de synchronisation
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;

// S'endormir sur la condition en libérant le mutex
int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex);

// Réveiller un processus en attente de la condition
int pthread_cond_signal(pthread_cond_t *cond);

// Réveiller tous les processus en attente de la condition
int pthread_cond_broadcast(pthread_cond_t *cond);

// Supprimer une condition de synchronisation
int pthread_cond_destroy(pthread_cond_t *cond);

Travail à faire :

Les philosophes et les spaghettis

Présentation

Nous retrouvons dans un restaurant N philosophes attablés pour manger un plat de spaghettis. Chaque philosophe alterne des périodes de ripaille et des périodes d'intense réflexion. Malheureusement, le restaurateur a placé seulement une fourchette entre chaque philosophe soit N fourchettes et, bien entendu, les philosophes ont besoin de deux fourchettes pour manger. Ils appliquent donc l'algorithme suivant :

Répéter
    prendre les fourchettes de droite et de gauche (si possible)
    manger
    reposer les fourchettes
    méditer sur la cuisson de spaghettis
Jusqu'à ...

On vous demande d'écrire un programme qui simule l'activité des philosophes pour régler le partage des fourchettes. Commencez avec deux puis 5 ou 6 philosophes.

Comment faire ?

On vous donne les indications suivantes :

Je vous conseille de suivre les étapes ci-dessous:

  1. Le restaurateur prépare la table (en clair, commencez par initialiser le tableau, le verrou et la condition de synchronisation).
  2. Dans un deuxième temps, les philosophes arrivent (en clair, créez n threads, un par philosophe).
  3. Chaque philosophe ne s'intéresse qu'à son collègue de droite et de gauche (en clair, calculez le numéro des philosphes à gauche et à droite).
  4. Les philosophes se bloquent sur la condition de synchronisation pour attendre que leurs DEUX fourchettes soient libres (les voisins ne mangent pas).
  5. Pensez à donner de la lecture à chaque philosophe (en clair, ralentissez les processus en appelant la fonction sleep).