Stan bezpieczny na pewno nie jest zakleszczony, ale jeśli nie możesz spełnić wszystkich wymagań, aby zapobiec zakleszczeniu, może to nastąpić. Na przykład, jeśli dwa wątki mogą wpaść w impas, gdy zaczynają wątek A, to wątek B, ale gdy zaczynają się przeciwnie (B, A), będą działać dobrze - załóżmy, że B jest ładniejszy;) Stan systemu jest niebezpieczny, ale przy szczęśliwej sekwencji początkowej będzie działać. Bez impasu, ale jest to możliwe. Jeśli również zsynchronizujesz je ręcznie - zaczniesz w odpowiedniej kolejności - jest to niebezpieczne - z jakiegoś powodu mogą nie zostać wystrzelone tak, jak lubisz - system nadal jest niebezpieczny (z powodu możliwego impasu), ale jest małe prawdopodobieństwo tego. W przypadku niektórych zdarzeń zewnętrznych, takich jak zamrażanie wątków lub przerwanie po kontynuowaniu, zakończy się niepowodzeniem.
Musisz zdać sobie sprawę - stan bezpieczny jest warunkiem wystarczającym, aby uniknąć impasu, ale niebezpieczny jest tylko warunkiem koniecznym. Trudno jest teraz napisać kod, ale mogę go wyszukać. Zetknąłem się z kodem w Adzie, który ponad 99/100 razy działał idealnie przez kilka tygodni (a potem przestał działać z powodu restartu serwera, a nie zakleszczenia), ale raz na jakiś czas zawieszał się po kilku sekundach do stanu zakleszczenia.
Dodajmy prosty przykład w porównaniu do dzielenia: jeśli twoja funkcja dzieli c / d i zwraca wynik, bez sprawdzania, czy d jest równe 0, może wystąpić błąd dzielenia przez zero, więc kod jest niebezpieczny (zamierzone takie samo nazewnictwo), ale do robisz taki podział, wszystko jest w porządku, ale po analizie teoretycznej kod jest niebezpieczny i może popaść w niezdefiniowane zachowanie, które nie będzie właściwie obsługiwane.