Si vous soupçonnez un interblocage, faites un ps aux | grep <exe name>
, si en sortie, le PROCESS STATE CODE
est D
(Veille sans interruption) signifie qu'il s'agit d'une impasse. Parce que, comme @daijo l'a expliqué, disons que vous avez deux threads T1
&T2
et deux sections critiques protégées chacune par semaphores S1 & S2
alors si T1
acquiert S1
et T2
acquiert S2
et après cela, ils essaient d'acquérir l'autre verrou avant de renoncer à celui qu'ils détenaient déjà, cela conduira à une impasse et en faisant un ps aux | grep <exe name>
, le process state code
sera D
(c'est-à-dire un sommeil ininterrompu).
Outils :
Valgrind, Lockdep (utilitaire du noyau Linux)
Consultez ce lien sur les types de blocages et comment les éviter :http://cmdlinelinux.blogspot.com/2014/01/linux-kernel-deadlocks-and-how-to-avoid.html
Modifier :ps aux
sortie D
"pourrait" signifier que le processus est dans l'impasse, d'après ce document redhat :
État de veille sans interruption
Un état de veille sans interruption est un état qui ne traite pas un signal immédiatement. Il ne se réveillera qu'à la suite de la disponibilité d'une ressource attendue ou après qu'un délai d'attente se soit produit pendant cette attente (si le délai d'attente est spécifié lorsque le processus est mis en veille).
Je vous suggère de regarder Helgrind :un détecteur d'erreurs de thread.
L'exemple le plus simple d'un tel problème est le suivant.
Imaginez une ressource partagée R, qui, pour une raison quelconque, est gardée par deux verrous, L1 et L2, qui doivent tous deux être détenus lors de l'accès à R.
Supposons qu'un thread acquiert L1, puis L2, et procède à l'accès à R. L'implication de ceci est que tous les threads du programme doivent acquérir les deux verrous dans l'ordre d'abord L1 puis L2. Ne pas le faire risque d'aboutir à une impasse.
Le blocage peut se produire si deux threads - appelez-les T1 et T2 - veulent tous deux accéder à R. Supposons que T1 acquiert L1 en premier et que T2 acquiert L2 en premier. Ensuite, T1 essaie d'acquérir L2 et T2 essaie d'acquérir L1, mais ces verrous sont déjà détenus. Donc T1 et T2 deviennent bloqués."