
Deadlock
Deadlock uppstår då man har låsningar som har ett cirkulärt beroende. Tillexempel: först går tråd 1 går och låser lås 2 och tråd 2 går och låser lås 1. Sedan försöker tråd 1 låsa lås 1 men denna är redan låst av tråd 2. På samma sätt vill tråd 2 låsa lås 2 men denna är redan låst av lås 1. Nu står trådarna och väntar på varann och deadlock har uppståt. Det är denna situation som kan uppstå i program 3a. 

Vilket vi kan så då trådfunktionen tf1 börjar med att köra kommandot pthread_mutex_lock(&m1) och låser m1 medans den andra trådfunktionen tf2 låser m2 först med kommandot pthread_mutex_lock(&m2).

Trylcok 
3b använder istället trylock som gör det möjligt att testa om ett visst lås är låst eller ej utan att ställa sig och vänta på att låset ska låsas up. Detta beskrivs i manualen för pthread_mutex_lock enligt i det 6e stycket.

På detta settet kan trådarna i 3b göra ett ett snabbt test om det går att få det andra låset eller inte. Får tåden inte det andra låset kan den snabbt gå och låsa up den första igen. Tråden kommer alltså inte stå och vänta tills den andra tråden låser upp resursen (Vilket kommer att ta tid eftersom den andra tråden i sin tur står och väntar på samma sak) Därför uppkommer inte situationen när båda trådar står och väntar på varann som i program 3a. 

Enligt manualen för pthread_mutex_lock under retrun value andra stycket kommer pthread_mutex_trylock att returnera 0 om tråden får låset. Detta implementeras i koden för 3b genom att man kör en if-sats där man vid returvärdet noll kan gå in i den kritiska sektionen. annars låser man direkt upp en det första låset. Nedan föler ett exempel på detta från koden:

if(pthread_mutex_trylock(&m2)) {
      ..........
      pthread_mutex_unlock(&m1); pthread_mutex_unlock(&m2);
}
else pthread_mutex_unlock(&m1);

