POSIX permite mutex para ser recursivo. Eso significa que el mismo hilo puede bloquear el mismo mutex dos veces y no se estancará. Por supuesto, también necesita desbloquearlo dos veces, de lo contrario, ningún otro hilo puede obtener el mutex. No todos los sistemas que admiten pthreads también son compatibles con mutexes recursivos, pero si quieren ser POSIX conform, they have to.recursiva de bloqueo (mutex) vs Bloqueo no recursiva (mutex)
Otras API (API de más alto nivel) también suelen ofrecer exclusiones mutuas, a menudo llamados bloqueos. Algunos sistemas/idiomas (por ejemplo, Cocoa Objective-C) ofrecen tanto mutexes recursivos como no recursivos. Algunos idiomas también solo ofrecen uno o el otro. P.ej. en Java los mutexes son siempre recursivos (el mismo hilo puede "sincronizarse" dos veces en el mismo objeto). Dependiendo de qué funcionalidad subproceso que ofrecen, no tener mutex recursivo podrían haber ningún problema, ya que fácilmente pueden escribirse a sí mismo (que ya se han aplicado los mutex recursivas a mí mismo sobre la base de más simples operaciones mutex/condición).
Lo que realmente no entiendo: ¿Cuáles son los mutex no recursivos bueno para? ¿Por qué querría tener un punto muerto de subproceso si bloquea el mismo mutex dos veces? Incluso los lenguajes de alto nivel que podrían evitar eso (por ejemplo, probar si se estancará y lanzar una excepción si lo hace) generalmente no hacen eso. Dejarán que el hilo se estanque en su lugar.
Esto es solo para casos, donde accidentalmente lo bloqueo dos veces y lo desbloqueo solo una vez y en caso de un mutex recursivo, sería más difícil encontrar el problema, por lo que lo tengo punto muerto inmediatamente para ver dónde está el incorrecto bloqueo aparece? ¿Pero no podría hacer lo mismo con tener un contador de bloqueo devuelto al desbloquear y en una situación en la que estoy seguro de haber liberado el último bloqueo y el contador no es cero, puedo lanzar una excepción o registrar el problema? ¿O hay algún otro caso de uso más útil de mutexes no recursivos que no veo? ¿O tal vez solo sea el rendimiento, ya que un mutex no recursivo puede ser ligeramente más rápido que uno recursivo? Sin embargo, probé esto y la diferencia realmente no es tan grande.
su explicación sobre el mutex no recursivo sonaba más como un semáforo. Un mutex (recursivo o no recursivo) tiene una noción de propiedad. –
@JayD Es muy confuso cuando la gente discute sobre cosas como estas ... ¿quién es la entidad que define estas cosas? – Pacerier
@Pacerier El estándar relevante. Esta respuesta es, p. mal para posix (pthreads), donde desbloquear un mutex normal en un hilo que no sea el hilo que lo bloqueó es un comportamiento indefinido, mientras que hacer lo mismo con un error de comprobación o mutex recursivo da como resultado un código de error predicable. Otros sistemas y estándares pueden comportarse de manera muy diferente. – nos