Le rendez-vous inversé
Exercice · niveau 2 · informatique (MP2I/MPI), chapitre 22 — Concurrence et synchronisation
Énoncé
Le cours affirme que si l'on inversait « signaler » et « attendre » dans le rendez-vous, l'interblocage serait immédiat. Le vérifier, et généraliser.
Corrigé
/* fil A */ /* fil B */
sem_wait(&arrive_b); sem_wait(&arrive_a); /* INVERSÉ */
sem_post(&arrive_a); sem_post(&arrive_b);
Mesuré, trois exécutions sur trois : zéro fil franchit le rendez-vous, et le programme doit être tué. Avec l'ordre du cours — signaler puis attendre — les deux fils passent, trois fois sur trois.
Le raisonnement : les deux sémaphores partent à . Le fil attend arrive_b, que seul peut incrémenter ; mais attend arrive_a, que seul peut incrémenter. Chacun attend un signal que l'autre n'enverra qu'après avoir reçu le sien. Le blocage est immédiat et certain — il ne dépend d'aucun entrelacement, contrairement aux défauts des exercices précédents.
La généralisation vaut d'être retenue. Un fil qui attend possède deux natures d'actions : celles qui donnent quelque chose aux autres, et celles qui en demandent.
| On donne d'abord | `sem_post` : libérer, signaler, publier |
|---|---|
| On demande ensuite | `sem_wait` : attendre, verrouiller, réserver |
Tout ce qu'on peut donner, on le donne avant de demander quoi que ce soit. La règle couvre trois situations que le chapitre présente séparément : le rendez-vous (signaler avant d'attendre), le producteur-consommateur (ne pas tenir un verrou en attendant, exercice 22.8), et l'ordre des verrous (exercice 22.9). Ce sont trois instances d'un même principe : on ne retient pas une ressource pendant qu'on en attend une autre.
Une remarque de fiabilité : ce défaut-ci se voit au premier essai, puisqu'il ne dépend d'aucun ordonnancement. C'est le bon cas. Les défauts de concurrence qui coûtent cher sont ceux qui, comme aux exercices 22.4 et 22.5, exigent un entrelacement particulier pour se manifester.
Les autres exercices de ce chapitre Le cours du chapitre
Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.