#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <pthread.h>
/*
    det vi kan se i koden är att en cyklisk väntan uppstår då båda trådarna drar i resuresen och sen ligger och väntar,
    detta medför att man inte lämnar tillbaka släpper resursen utan håller de kvar. Min lösning är att först testa låsa
    en resurs och sen kolla om man kan låsa den andra trylook och om detta inte går så släpper vi resursen vi precis kört mutex_lock på.
    med hjälp detta kan vi kolla koll på att mutex inte håller något i onödan.
    sleepen som vi har vid båda trådfunktionen efter vi låst resursen behöver inte vara random då vi bara behöver hålla i den i en sekund



*/
pthread_mutex_t resource[5];
char res_str[] = "00000";

int pick()
{
    return rand()%5;
}
int pick2()
{
    return rand()%2+1;
}

void* t1 (void * p)
{
    int r1, r2;
    while(1)
    {
        r1=pick();
        r2=pick();
        sleep(pick2());
        pthread_mutex_lock(&resource[r1]);
        if(!pthread_mutex_trylock(&resource[r2]))
        {
            res_str[r1]='1';

            res_str[r2]='1';
            sleep(1);
            res_str[r1]='0';
            res_str[r2]='0';
            pthread_mutex_unlock(&resource[r1]);
            pthread_mutex_unlock(&resource[r2]);
        }else
            pthread_mutex_unlock(&resource[r1]);
    }
}

void* t2 (void * p)
{
    int r1, r2;
    while(1)
    {
        r1=pick();
        r2=pick();
        sleep(pick2());
        pthread_mutex_lock(&resource[r1]);
        if(!pthread_mutex_trylock(&resource[r2]))
        {
            res_str[r1]='2';

            res_str[r2]='2';
            sleep(1);
            res_str[r1]='0';
            res_str[r2]='0';
            pthread_mutex_unlock(&resource[r1]);
            pthread_mutex_unlock(&resource[r2]);
        }
        else
            pthread_mutex_unlock(&resource[r1]);
    }
}

main()
{
    int i=0,n;
    pthread_t id1, id2;
    pthread_create(&id1,NULL,&t1,NULL);
    pthread_create(&id2,NULL,&t2,NULL);
    while(i++<30)
    {
        sleep(1);
        printf("%2d: %s\n", i, res_str);
    }
}
