I uppgift3a ägs oftast den ena mutexen av ena tråden medan den andra mutexen ägs av andra tråden. Efter att båda trådarna äger varsin mutex står de och väntar på att den andra ska bli ledig och det uppstår en cirkulär deadlock där båda väntar på varandra. Däremot i uppgift3b så testar båda trådarna om den mutexen de inte för tillfället äger är ledig. Första tråden låser alltså första mutexen nästan samtidigt som andra tråden låser den andra mutexen. Testet, ett trylock-test [1], görs i en if-sats och om testet lyckas, d.v.s. om den mutexen som tråden i fråga inte äger är ledig, kommer denna tråd att äga båda mutexar, vänta en stund och sedan släppa båda mutexar. I samma stund detta sker (ena tråden har båda mutexar i sin ägo) så fortsätter andra tråden testa om den tråden som denna tråd inte äger är ledig. 

Men när första tråden ägde båda trådar så ägde inte andra tråden några trådar, hur gick det till? Jo, i den där if-satsen där trylock-testet ägde rum fanns också en else-sats som skulle köras om testet misslyckades. I den else-satsen släppte alltså den misslyckande tråden den mutexen som den ägde och när denna mutex blev ledig var då den andra tråden troligtvis lyckades med sitt test, just eftersom den tråden som misslyckades med testet släppte mutexen den ägde och då alltså inte ägde någon tråd. Detta är möjligt just eftersom trylock-testet ger ett svar på direkten [1] om mutexen som en tråd försöker äga är ledig eller inte, till skillnad från om en tråd redan äger en mutex som en annan tråd försöker äga via pthread_mutex_lock, då får tråden vänta på plats tills den mutexen blir ledig.

Alltså, just eftersom att det i uppgift3a inte finns några tester medan i uppgift3b finns det ett test som, vid misslyckande, nästan direkt tillåter tråden att släppa mutexen den äger så uppstår det inte en deadlock i uppgift3b. I uppgift3a, efter att en tråd äger en mutex och en annan tråd äger en annan mutex så väntar de på varandra och "står stilla" eftersom om en tråd vill äga en mutex som redan ägs av någon annan blir tråden "blockerad" om man försöker använda sig av pthread_mutex_lock [2], som används i uppgift3a, och kan alltså inte göra något annat än att vänta. Den situationen uppstår då i uppgift3a. I uppgift3b däremot så fortsätter trådarna att "röra" sig uppifrån och ner i while-loopen eftersom de får ett direkt svar om låsningen lyckades eler ej och blir då inte blockerade när testet utförs i en if-sats och då (vid misslyckande) istället går mot else-satsen, släpper mutexen som den äger och gör den tillgängling åt andra tråden och fortsätter därifrån.



Referenser:
[1] Manualsidan pthread_mutex_lock. "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."

[2] Manualsidan pthread_mutex_lock. "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."
