
					Uppgift 3

Om program A fungerar beror helt på slumpen, att låsningarna i tf1 och tf2 bara inte råkar krocka, vilket förklarar hur resultatet kan variera så mellan körningar. Först sleepar båda en slumpad tid, sedan börjar tf1 med att låsa m1, medan tf2 börjar med att låsa m2. Därefter låser tf1 m2 och tf2 m1, och det kan då skapa konflikt, då m1 redan tillhör tf1 och m2 tillhör tf2, om inte den slumpmässiga sleepen lyckats få dem att inte krocka, vilket låter den som vaknade först även låsa den andra. Om inte detta är fallet väntar de ena på att den andra ska bli klar och vice versa. Detta är då en deadlock. Då ingen av trådarna lyckas äga resurserna skrivs 0 ut, vilket är initieringsvärdet för trådvariabeln. Efter en slumpad tidsperiod låser de upp sina mutexar, vilket får stopp på låsningen, och hela processen startar om.

Program B börjar likadant, tf1 låser m1, tf2 låser m2, men när de ska låsa de andra mutexen gör de istället en pthread_mutex_trylock. trylock fungerar som lock, bara att den inte väntar på att resursen blir ledig, utan returnerar direkt istället. Om den i detta fall misslyckas låser programmet även upp den första mutexen, m1 för tf1, m2 för tf2. Detta innebär att den andra tråden även kan låsa den andra mutexen, och deadlock undviks. Därefter skrivs trådens nummer ut, och tråden låser upp båda mutexarna.
