Я бы лучше объяснил это в терминах, совершенно не связанных с компьютерами, поскольку зачастую это лучший способ донести идею.
У меня есть пятилетний сын и трехлетняя дочь. Оба хотят сделать одну и ту же книжку-раскраску.
Дочь хватает карандаши, а сын - книгу. Ни один из них не откажется от того, что у них есть, пока не получит другого.
Это тупик. Это не становится проще, чем это.
Ваши процессы (или дочерние элементы) застряли в ожидании друг друга и будут продолжать ждать бесконечно, пока какой-нибудь другой вышестоящий процесс (например, папа) не войдет и не выйдет из тупика.
По крайней мере, с детьми вы можете (иногда) заставить одного из них выяснить причину и освободить их замок. Обычно это невозможно на компьютерах, поскольку процессы не выполняют ничего , за исключением ожидания этого ресурса (хотя иногда дети также переходят в это состояние).
Следование одному правилу гарантирует невозможность тупика:
- У всех потоков выполнения выделяются ресурсы в том же порядке.
Следование некоторым дополнительным правилам уменьшит вероятность того, что ваши потоки будут тормозить друг друга, но имейте в виду, что вышеприведенное правило должно иметь приоритет над всеми остальными:
- Выделяйте ресурсы только тогда, когда они вам нужны.
- Отпустите их, как только закончите с ними.