Malheureusement, tout le monde a manqué la différence la plus importante entre le sémaphore et le mutex ; le concept de " propriété ".
Les sémaphores n'ont aucune notion de propriété, ce qui signifie que n'importe quel thread peut libérer un sémaphore (cela peut conduire à de nombreux problèmes en soi mais peut aider à la "détection de mort"). Alors qu'un mutex a le concept de propriété (c'est-à-dire que vous ne pouvez libérer un mutex que vous avez acquis).
La propriété est incroyablement importante pour la programmation sûre des systèmes concurrents. Je recommanderais toujours d'utiliser un mutex de préférence à un sémaphore (mais il y a des implications en termes de performances).
Les mutex peuvent également prendre en charge l'héritage de priorité (ce qui peut aider à résoudre le problème de l'inversion de priorité) et la récursion (ce qui élimine un type de blocage).
Il convient également de préciser qu'il existe des sémaphores "binaires" et des sémaphores "de comptage/généraux". Le sémaphore de Java est un sémaphore de comptage et permet donc d'être initialisé avec une valeur supérieure à un (alors que, comme indiqué, un mutex ne peut avoir qu'un compte conceptuel de un). L'utilité de ceci a été soulignée dans d'autres billets.
Donc pour résumer, à moins que vous n'ayez plusieurs ressources à gérer, je recommanderais toujours le mutex plutôt que le sémaphore.
0 votes
Requête similaire dans stackoverflow.com/questions/4039899/