Eso depende ciertamente de (al menos) dos cosas:
- ¿Cómo se implementa la exclusión mutua, y
- ¿Cómo se bloquea el hilo (no se lanzan una excepción, o es simplemente "desaparecen") .
Por ejemplo, en synchronized
bloques de Java están garantizados para ser liberado cuando el "hilo se realiza con el objeto" - sea lo que sea (ver link). De acuerdo con el artículo this:
Al detener un hilo, se desbloquea todos los monitores que ha bloqueado.
Ok, stop()
ing los comunicados de los monitores de hilo, pero lo que si un hilo simplemente desaparece de alguna manera, es entonces "realiza con el objeto"? No veo esto documentado en ningún lado. Pero es obvio que alguien debe liberar mutexes bloqueados, o de lo contrario se estancarán; quizás algunos mutexes o entornos incluyen mecanismos que liberan mutexes automáticamente si el hilo, que los bloqueó, se vuelve inexistente.
Otro ejemplo: java.util.concurrent.Lock se recomienda utilizar una declaración finally
para liberar el bloqueo de manera que pase lo que pase con el hilo en ejecución, se libere el bloqueo. Pero, si el hilo desaparece antes de que se ejecute la instrucción finally
, entonces el bloqueo nunca se libera y de hecho ocurre un interbloqueo. Por supuesto, los hilos no deberían "desaparecer" simplemente así.
¡Una buena pregunta!
Proporcione información adicional. – InsertNickHere