POSIX permet aux mutex d'être récursifs. Cela signifie que le même thread peut verrouiller le même mutex deux fois et ne sera pas bloqué. Bien sûr, il doit également le déverrouiller deux fois, sinon aucun autre thread ne peut obtenir le mutex. Tous les systèmes prenant en charge les pthreads ne prennent pas également en charge les mutex récursifs, mais s'ils veulent être conformes à POSIX, ils doivent le faire .
D'autres API (API de plus haut niveau) proposent également généralement des mutex, souvent appelés Locks. Certains systèmes / langages (par exemple Cocoa Objective-C) offrent à la fois des mutex récursifs et non récursifs. Certaines langues n'offrent également que l'une ou l'autre. Par exemple, en Java, les mutex sont toujours récursifs (le même thread peut se "synchroniser" deux fois sur le même objet). En fonction des autres fonctionnalités de thread qu'ils offrent, ne pas avoir de mutex récursifs pourrait ne pas poser de problème, car ils peuvent facilement être écrits vous-même (j'ai déjà implémenté des mutex récursifs moi-même sur la base d'opérations mutex / condition plus simples).
Ce que je ne comprends pas vraiment: à quoi servent les mutex non récursifs? Pourquoi voudrais-je avoir un blocage de thread s'il verrouille deux fois le même mutex? Même les langages de haut niveau qui pourraient éviter cela (par exemple, tester si cela va bloquer et lever une exception si c'est le cas) ne le font généralement pas. Ils laisseront le thread bloqué à la place.
Est-ce uniquement pour les cas où je le verrouille accidentellement deux fois et ne le déverrouille qu'une seule fois et dans le cas d'un mutex récursif, il serait plus difficile de trouver le problème, donc à la place, je le verrouille immédiatement pour voir où le verrou incorrect apparaît? Mais ne pourrais-je pas faire la même chose avec le retour d'un compteur de verrouillage lors du déverrouillage et dans une situation où je suis sûr que j'ai relâché le dernier verrou et que le compteur n'est pas nul, je peux lever une exception ou enregistrer le problème? Ou y a-t-il un autre cas d'utilisation plus utile de mutex non récursifs que je ne vois pas? Ou est-ce peut-être juste des performances, car un mutex non récursif peut être légèrement plus rapide qu'un mutex récursif? Cependant, j'ai testé cela et la différence n'est vraiment pas si grande.