Uppgift 3:
a) "The mutex object referenced by mutex shall be locked by calling pthread_mutex_lock(). If the mutex is already locked, the calling thread shall block until the mutex becomes available."[5] Det manual sidorna säger oss här är att om vi inte lyckas att låsa när vi anropar pthread_mutex_lock() så ligger vi och väntar där tills att vi kan låsa. Om då t.ex. två trådar har låst varsinn mutex, m1 respektive m2, och sedan ligger de och väntar på varandras låsta mutex så har vi ett deadlock. Deadlock uppstår därför ofta i uppg3a.c därför att låsningen sker inte i samma ordning för trådarna. 

Tråd 1 låser alltid först mutex m1[1], sover 1 sekund[1], sedan låser den m2[2]. Tråd 2 gör tvärtom, den låser först mutex m2[3], sover 1 sekund[3], sedan låser den m1[4]. Det som gör dock att deadlock sker så ofta, i princip varje körning, är att tråden sover i 1 sekund mellan låsningarna vilket ökar risken för deadlock. Ju större "avstånd" i tid mellan låsningar desto större chans att processorn byter tråd att arbeta med.

Ett enkelt sätt att lösa problemet är att byta i Tråd 2 så att den också låser mutex m1 först. Dvs gör så att den låser mutex m1 på rad 28 och mutex m2 på rad 29 i uppg3a.c. Om alla trådar låser mutexar i samma ordning så kommer inga deadlocks att ske i det här programmet.

b) Även fast uppg3b.c gör samma misstag som uppg3a.c, d.v.s. den låser också sina mutex i en dålig ordning så kan den arbeta runt det då den använder sig av pthread_mutex_try_lock() som försöker att låsa en mutex och om den inte lyckas så returnerar den omedelbart att den inte lyckades, då kan programmet hantera det genom att låsa upp m2 och sedan prova igen. Följande citat från manualsidorna för pthread_mutex_trylock förklarar vidare: "The pthread_mutex_trylock() function shall be equivalent to pthread_mutex_lock(), except that if the mutex object referenced by mutex is currently locked (by any thread, including the current thread), the call shall return immediately."[5] Den här returnering, vid lyckad låsning eller misslyckade, kan tas hand om i en if sats som kan välja att fortsätta (om låsningen är lyckad) eller att backa tillbaka (om låsningen är misslyckad).

[1] Rad 17 i uppg3a.c
[2] Rad 18 i uppg3a.c
[3] Rad 28 i uppg3a.c
[4] Rad 29 i uppg3a.c
[5] Citat ur manualsidan för pthread_mutex_lock/trylock/unlock
