Pokud máte podezření na zablokování, proveďte ps aux | grep <exe name>
, pokud je na výstupu, PROCESS STATE CODE
je D
(Nepřerušitelný spánek) znamená, že došlo k uváznutí. Protože, jak vysvětlil @daijo, řekněme, že máte dvě vlákna T1
&T2
a dvě kritické sekce, každá chráněná semaphores S1 & S2
pak pokud T1
získává S1
a T2
získává S2
a poté se pokusí získat druhý zámek, než se vzdají toho, který již mají, to povede k uváznutí a provedení ps aux | grep <exe name>
, process state code
bude D
(tj. Nepřerušitelný spánek).
Nástroje:
Valgrind, Lockdep (utilita pro linuxové jádro)
Podívejte se na tento odkaz o typech uváznutí a o tom, jak se jim vyhnout:http://cmdlinelinux.blogspot.com/2014/01/linux-kernel-deadlocks-and-how-to-avoid.html
Upravit:ps aux
výstup D
"Mohl" znamená, že proces je v mrtvém bodě, z tohoto dokumentu redhat:
Stav nepřerušitelného spánku
Stav nepřerušitelného spánku je stav, který nezpracuje signál hned. Probudí se pouze v důsledku zpřístupnění vyčkávaného zdroje nebo po vypršení časového limitu během tohoto čekání (pokud je časový limit specifikován při uspání procesu).
Navrhoval bych, abyste se podívali na Helgrind:detektor chyb vláken.
Nejjednodušší příklad takového problému je následující.
Představte si nějaký sdílený zdroj R, který je z jakéhokoli důvodu střežen dvěma zámky, L1 a L2, které musí být oba drženy, když je přístup R.
Předpokládejme, že vlákno získá L1, pak L2 a pokračuje v přístupu k R. Důsledkem toho je, že všechna vlákna v programu musí získat dva zámky v pořadí nejprve L1 a pak L2. Pokud tak neučiníte, riskujete uváznutí.
K uváznutí může dojít, pokud dvě vlákna -- nazývají je T1 a T2 -- chtějí mít přístup R. Předpokládejme, že T1 získá nejprve L1 a T2 jako první získá L2. Potom se T1 pokusí získat L2 a T2 se pokusí získat L1, ale oba tyto zámky jsou již drženy. T1 a T2 se tak zablokují."