Если вы подозреваете тупик, введите ps aux | grep <exe name>
, если на выходе PROCESS STATE CODE
равен D
(непрерывный сон), это означает, что это тупик.Потому что, как объяснил @daijo, скажем, у вас есть два потока T1
& T2
и два критических раздела, каждый из которых защищен semaphores S1 & S2
, тогда если T1
получает S1
, а T2
получает S2
и после этого они пытаютсязахватить другой замок перед тем, как освободить тот, который у них уже есть, это приведет к тупику, и при выполнении ps aux | grep <exe name>
process state code
будет D
(т.е. непрерывный сон).
Инструменты:
Valgrind, Lockdep (утилита ядра Linux)
Проверьте эту ссылку на типы взаимоблокировок и как их избежать: http://cmdlinelinux.blogspot.com/2014/01/linux-kernel-deadlocks-and-how-to-avoid.html
Редактировать: ps aux
вывод D
«мог» означать, что процесс находится в тупике, из этого redhat doc :
Состояние бесперебойного сна
Бесперебойное состояние сна это то, которое не будет обрабатывать сигнал сразу.Он активируется только в результате появления ожидаемого ресурса или после истечения времени ожидания во время этого ожидания (если время ожидания указано, когда процесс переведен в спящий режим).