Se sospetti un deadlock, esegui un ps aux | grep <exe name>
, se in output, il PROCESS STATE CODE
è D
(Uninterruptible sleep) significa che è un deadlock. Perché, come ha spiegato @daijo, diciamo che hai due thread T1
&T2
e due sezioni critiche ciascuna protetta da semaphores S1 & S2
quindi se T1
acquisisce S1
e T2
acquisisce S2
dopodiché tentano di acquisire l'altro blocco prima di abbandonare quello già detenuto da loro, questo porterà a una situazione di stallo e facendo un ps aux | grep <exe name>
, il process state code
sarà D
(ovvero sonno ininterrotto).
Strumenti:
Valgrind, Lockdep (utilità del kernel Linux)
Controlla questo link sui tipi di deadlock e su come evitarli:http://cmdlinelinux.blogspot.com/2014/01/linux-kernel-deadlocks-and-how-to-avoid.html
Modifica:ps aux
output D
"potrebbe" significa che il processo è in una situazione di stallo, da questo documento redhat:
Stato di sospensione non interrompibile
Uno stato di sospensione non interrompibile è uno stato che non gestisce immediatamente un segnale. Si riattiverà solo come risultato della disponibilità di una risorsa attesa o dopo che si verifica un timeout durante tale attesa (se il timeout è specificato quando il processo viene messo in sospensione).
Ti suggerirei di dare un'occhiata a Helgrind:un rilevatore di errori di thread.
L'esempio più semplice di tale problema è il seguente.
Immagina una risorsa condivisa R, che, per qualsiasi motivo, è protetta da due blocchi, L1 e L2, che devono essere mantenuti entrambi quando si accede a R.
Supponiamo che un thread acquisisca L1, quindi L2 e proceda ad accedere a R. L'implicazione di ciò è che tutti i thread nel programma devono acquisire i due blocchi nell'ordine prima L1 e poi L2. In caso contrario, si rischia una situazione di stallo.
Il deadlock potrebbe verificarsi se due thread - chiamali T1 e T2 - vogliono entrambi accedere a R. Supponiamo che T1 acquisisca prima L1 e T2 acquisisca prima L2. Quindi T1 tenta di acquisire L2 e T2 tenta di acquisire L1, ma entrambi i blocchi sono già mantenuti. Quindi T1 e T2 si bloccano."