Der sichere Zustand ist sicher Deadlock-frei, aber wenn Sie nicht alle Anforderungen erfüllen können, um einen Deadlock zu verhindern, kann dies auftreten. Wenn zum Beispiel zwei Threads beim Starten von Thread A in einen Deadlock geraten, dann Thread B, aber wenn sie das Gegenteil (B, A) starten, funktionieren sie einwandfrei - lassen Sie mich annehmen, dass B besser ist;) Der Systemzustand ist unsicher, aber mit der glücklichen Startsequenz wird es funktionieren. Kein Deadlock, aber es ist möglich. Wenn Sie sie auch von Hand synchronisieren - in guter Reihenfolge starten - ist dies gefährlich - aus irgendeinem Grund werden sie möglicherweise nicht wie gewünscht abgefeuert - das System ist immer noch unsicher (wegen eines möglichen Deadlocks), aber die Wahrscheinlichkeit dafür ist gering. Bei einigen externen Ereignissen wie dem Einfrieren von Threads oder Interrupts nach dem Fortfahren schlägt dies fehl.
Sie müssen erkennen, dass ein sicherer Zustand eine ausreichende Bedingung ist, um einen Deadlock zu vermeiden, aber ein unsicherer Zustand ist nur ein notwendiger Zustand. Es ist momentan schwer, Code aus dem Kopf zu schreiben, aber ich kann nach etwas suchen. Ich habe in Ada Code gefunden, der mehr als 99/100 Mal mehrere Wochen lang einwandfrei funktionierte (und dann aufgrund eines Neustarts des Servers, nicht eines Deadlocks, gestoppt wurde), aber hin und wieder nach einigen Sekunden in den Deadlock-Zustand stürzte.
Lassen Sie mich ein einfaches Beispiel im Vergleich zur Division hinzufügen: Wenn Ihre Funktion c / d dividiert und das Ergebnis zurückgibt, ohne zu prüfen, ob d gleich 0 ist, kann es zu einem Fehler der Division durch Null kommen, sodass der Code unsicher ist (gleiche Benennung beabsichtigt), aber bis Wenn Sie eine solche Unterteilung vornehmen, ist alles in Ordnung, aber nach der theoretischen Analyse ist der Code unsicher und kann in undefiniertes Verhalten verfallen, das nicht richtig gehandhabt wird.