Mutex vs sémaphore : les différences expliquées
Un mutex protège une section critique pour qu'un seul thread à la fois puisse utiliser une ressource partagée, et le thread qui l'a verrouillé doit être celui qui le déverrouille. Un sémaphore est un compteur : il contrôle combien de threads peuvent utiliser une ressource limitée, et il peut aussi servir à signaler des événements d'un thread à un autre. Le mutex relève de la propriété et de l'exclusion ; le sémaphore du comptage et de la signalisation.
| Critère | Mutex | Sémaphore |
|---|---|---|
| Objectif | Exclusion mutuelle : un seul thread à la fois dans une section critique | Comptage : limiter l'accès à un pool de N ressources, ou signaler des événements entre threads |
| Valeur | Verrouillé ou déverrouillé (binaire) | Un compteur entier non négatif (un sémaphore binaire est le cas particulier 0 ou 1) |
| Propriété | Appartient au thread qui l'a verrouillé, et ce thread doit le déverrouiller | Pas de propriétaire : n'importe quel thread peut faire un post ou signaler |
| Opérations | Lock et unlock | Wait (P, décrémentation) et post (V, incrémentation) |
| Signalisation entre threads | Non prévu pour cela | Oui : par exemple un producteur qui signale un consommateur |
| Inversion de priorité | Souvent évitée grâce à l'héritage de priorité | Généralement non prise en charge |
| Usages typiques | Protection d'une structure de données partagée comme une liste ou un compteur | Limitation d'un pool de connexions, tampons producteur-consommateur bornés, signalisation d'un gestionnaire d'interruption vers une tâche |
| Pièges courants | Interblocage dû à un ordre de verrouillage incohérent, ou oubli du déverrouillage | Signaux perdus et interblocage lorsque les compteurs ne correspondent pas |
Les valeurs indiquées sont des ordres de grandeur typiques et varient selon la génération de procédé et le produit.