Uppgift 3

3a.

Detta program skapar väldigt ofta en deadlock för att tråd 1 begär tillgång till 
mutex m1 och m2 i motsatt ordning än tråd 2, alltså på ett cirkulärt vis. Det 
skapar ofta situationen att tråd 1 låser mutex m1 och försöker låsa mutex m2 
men under den sekunden som tråd 1 sover därimellan så har tråd 2 redan låst m2 
och vill ha tillgång till m1 som redan är låst. Alltså skapas en deadlock.

Detta sker inte alltid i programmet då tiden innan trådarna 
försöker låsa sina mutex, och tiden de är låsta, slumpas fram. På 
grund av detta uppstår ibland situationer där den ena tråden hinner 
ta båda mutex innan deadlock uppstår som i testkörning 1. Om slumpen 
vill så kan det undvikas helt som i testkörning 2.


3b.

Till skillnad från det andra programmet så använder sig detta av trylock 
med en if-sats när det försöker låsa sin andra mutex. Det är enda 
skillnaden. Phtread_mutex_trylock fungerar på en olåst mutex så 
att den returnerar noll och låser mutex precis som en vanlig mutex_lock. 
Är däremot angiven mutex redan låst så kommer trylock att inte att 
låsa denna utan direkt returnera med felkoden EBUSY utan att påverka 
angiven mutex. På grund av att trådarna låser upp sin första mutex om 
den misslyckas med trylock på den andra så skapar denna kod inga deadlock situationer.
