L'état sûr est sans blocage, c'est sûr, mais si vous ne pouvez pas remplir toutes les conditions pour éviter le blocage, cela peut se produire. Par exemple, si deux threads peuvent tomber dans une impasse lorsqu'ils démarrent le thread A, puis le thread B, mais lorsqu'ils démarrent l'opposé (B, A), ils fonctionneront correctement - je suppose que B est plus agréable;) L'état du système n'est pas sûr, mais avec une séquence de départ heureuse, cela fonctionnera. Pas d'impasse, mais c'est possible. Si vous les synchronisez également à la main - commencez dans le bon ordre - il est dangereux - pour une raison quelconque, ils ne peuvent pas être déclenchés comme vous le souhaitez - le système est toujours dangereux (en raison d'un blocage possible), mais il y a une faible probabilité à cela. En cas de certains événements externes comme le gel des threads ou des interruptions après la poursuite, il échouera.
Vous devez vous rendre compte - un état sûr est une condition suffisante pour éviter l'impasse, mais dangereux n'est qu'une condition nessaire. Il est difficile d'écrire du code de la tête en ce moment, mais je peux en chercher. J'ai rencontré du code dans Ada qui, plus de 99/100 fois, fonctionnait parfaitement pendant plusieurs semaines (puis s'est arrêté en raison d'un redémarrage du serveur et non d'un blocage), mais de temps en temps il se bloquait après plusieurs secondes dans un état de blocage.
Permettez-moi d'ajouter un exemple simple en comparant à la division: si votre fonction divise c / d et renvoie un résultat, sans vérifier si d est égal à 0, il peut y avoir une division par erreur zéro, donc le code n'est pas sûr (même dénomination), mais jusqu'à ce que vous faites une telle division, tout va bien, mais après que le code d'analyse théorique ne soit pas sûr et puisse tomber dans un comportement indéfini non géré correctement.