El estado seguro es un punto muerto seguro, pero si no puede cumplir con todos los requisitos para evitar el punto muerto, puede ocurrir. Por ejemplo, si dos subprocesos pueden caer en un punto muerto cuando comienzan el subproceso A, luego el subproceso B, pero cuando comienzan el opuesto (B, A) funcionarán bien, déjenme suponer que B es más agradable;) El estado del sistema no es seguro, pero con una secuencia de inicio afortunada funcionará. No hay punto muerto, pero es posible. Si también los sincroniza a mano, comience en buen orden, es peligroso, por alguna razón, es posible que no se activen como desee, el sistema aún no es seguro (debido a un posible punto muerto), pero hay poca probabilidad de que eso suceda. En el caso de algunos eventos externos como congelar hilos o interrupciones después de continuar, fallará.
Tienes que darte cuenta: el estado seguro es condición suficiente para evitar un punto muerto, pero inseguro es solo una condición necesaria. Es difícil escribir código de la cabeza en este momento, pero puedo buscar algunos. Encontré código en Ada que más de 99/100 veces funcionó perfectamente durante varias semanas (y luego se detuvo debido al reinicio del servidor, no a un punto muerto), pero de vez en cuando se bloqueaba después de varios segundos en estado de punto muerto.
Permítanme agregar un ejemplo sencillo comparándolo con la división: si su función divide c / d y devuelve el resultado, sin verificar si d es igual a 0, puede haber una división por cero error, por lo que el código no es seguro (se pretende el mismo nombre), pero hasta Si realiza dicha división, todo está bien, pero después del análisis teórico, el código no es seguro y puede caer en un comportamiento indefinido que no se maneja adecuadamente.