Skillnaden mellan uppg3a och uppg3b är bara hur själva trådarna hanterar hur de låser och låser upp sina mutex. I uppg3a tar båda trådarna först den ena mutexen, pthread_mutex_lock, och släpper inte den förren den fått den andra (pthread_mutex_lock gör att tråden försöker låsa mutexen, lyckas den inte göra det (för att den är låst av någon annan till exempel), står tråden kvara här tills den lyckas ta den/låsa den själv. Detta är inte alls särskillt bra då inget arbete kan utföras av tråden i detta läge. Det finns en slump generator med så skulle de båda av slumpen hamna i exakt samma ögoblick att den ena låser den första mutexen och sedan den andra låser den andra så uppstår en låsning, vilket har hänt i första exemplkörningen av uppg3a. 

I uppg 3b så har vi en trylock först innan tråden försöker låsa den andra mutexen, pthread_mutex_trylock. Om den sedan är låst så släpper vi den första mutexen, pthread_mutex_unlock, för att förhindra att den uppstår en låsning. 

En deadlock, kan bara inträffa då det finns flera trådar som vill ha resurser som är icke delbara. Alltså att de inte får finns flera trådar som ändrar i resursen samtidigt. Dessutom måste det vara cykliskt.

Pthread_mutex_lock gör i stort sett samma sak förutom att den kollar om det är låst, är den låst så går den vidare utan att låsa mutexen. Ur manualen pthread_mutex_trylock, "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".
