POSIX permet mutex être récursive. Cela signifie que le même thread peut verrouiller le même mutex deux fois et ne fait pas l'impasse. Bien sûr, elle a aussi besoin de déverrouiller deux fois, sinon, aucun autre thread ne peut obtenir le mutex. Pas tous les systèmes à l'appui de pthreads également en charge récursive mutex, mais si ils veulent être conforme POSIX, ils ont pour.
D'autres Api (plus haut niveau de l'Api) aussi offrent généralement des mutex, souvent appelé les Verrous. Certains systèmes/langues (par exemple le Cacao Objective-C) offrir à la fois récursives et non récursives mutex. Certains langages offrent seulement un ou de l'autre. E. g. en Java, les mutex sont toujours récursive (le même thread peut deux fois "synchroniser" sur le même objet). Selon ce que les autres fil des fonctionnalités qu'ils offrent, de ne pas avoir récursive mutex peut-être pas de problème, car ils peuvent facilement être écrit vous-même (je l'ai déjà mis en œuvre récursive mutex moi-même sur la base de plus simple mutex/état des opérations).
Ce que je ne comprends pas vraiment: Ce sont les non-récursive mutex? Pourquoi voudrais-je avoir un blocage de thread si elle verrouille la même mutex deux fois? Même à haut niveau de langues qui pourrait éviter que (par exemple test si cette situation de blocage et de lancer une exception si c'est le cas) n'est généralement pas le faire. Ils vont laisser le fil de blocage à la place.
Est-ce seulement pour les cas où j'ai accidentellement de verrouillage à deux reprises et ne déverrouiller une seule fois, et dans le cas d'un appel récursif à mutex, il serait plus difficile de trouver le problème, donc je l'ai impasse immédiatement pour voir où le verrouillage incorrect s'affiche? Mais ne pourrais-je pas faire de même avec un verrouillage compteur retourné lors du déverrouillage de et dans une situation où je suis sûr que j'ai publié le dernier lock et le compteur n'est pas à zéro, je peux jeter une exception ou journal le problème? Ou est-il plus utile de cas d'utilisation non récursive mutex que je n'arrive pas à voir? Ou est-ce peut-être juste de la performance, en tant que non-récursive mutex peut être légèrement plus rapide qu'un récursive? Cependant, j'ai testé et la différence est vraiment pas si grand que ça.