uppgift3.

i den första kodfilen allstå uppgift3a.c uppstår deadlock ganska ofta, och detta 
beror på att båda trådarna t1 och t2 låser båda mutex m1 cch m2 parallellt i en 
(cyklisk struktur). Detta ser vi i koden när t1 låser m1 med anropet till 
pthread_mutex_lock(&m1) med en sleep1 som följer. och parallellet så låser 
t2 mutex m2 med anropet pthread_mutex_lock(&m2). detta leder till en deadlock!

enligt manualsidorna för pthread_mutex_lock så står det att när en tråd försöker 
låsa en redan låst mutex så blir tråden blockerad tills den andra tråden 
släpper mutexen. Detta ser vi tydligt i programmet uppgift3a.c. när tråd 1 
efter sleep försöker låsa m2 så lyckas den inte och blir blockerad. eftersom 
tråd2 har redan låst mutex m2. och samma senario händer när tråd 2 försöker låsa 
m1 som är redan låst av tråd 1. 

i det andra programmet uppgift3b.c ser vi anropet till pthread_mutex_trylock() 
används. Om man läser i manualsidorna för pthread_mutex_trylock()så ser vi att 
trylock() anropet är ekvivalent med pthread_mutex_lock(). men skillnaden är 
att i trylock blir tråden inte blockerad när den försöker låsa en redan 
använd mutex, Detta ser vi i den andra kodfilen då båda trådarna försöker 
med trylock för att se om den andra tråden använder mutexen. På detta 
sätt undviks deadlock eftersom trådarna inte blockeras, och kan istället 
fortsätta sin körning tills mutexen släpps av andra tråden. detta 
förklarar varför vi ser nästan bara nollor i den första kodfilen medan 
i den andra filen så lyckas båda trådarna låsa båda m1 och m2, 
tack vare pthread_mutex_trylock().

DET ÄR DOCK VIKTIGT ATT BETONA BETYDELSEN AV pthread_mutex_unlock OM 
pthread_mutrex_trylock MISSLYCKAS ... Fx.


