From 5e425dcc7af2c266068c01c8f9ce0ef954640f91 Mon Sep 17 00:00:00 2001 From: tanmoyee04 <61410535+tanmoyee04@users.noreply.github.com> Date: Sun, 4 Oct 2020 20:31:18 +0530 Subject: [PATCH] Uploaded Dining Philosopher problem solution In this , I haven't used semaphores. --- C/Dining_Philosopher.c | 91 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 C/Dining_Philosopher.c diff --git a/C/Dining_Philosopher.c b/C/Dining_Philosopher.c new file mode 100644 index 0000000..9f923f8 --- /dev/null +++ b/C/Dining_Philosopher.c @@ -0,0 +1,91 @@ +#include + +#define n 4 + +int compltedPhilo = 0,i; + +struct fork{ + int taken; +}ForkAvil[n]; + +struct philosp{ + int left; + int right; +}Philostatus[n]; + +void goForDinner(int philID){ //same like threads concept here cases implemented + if(Philostatus[philID].left==10 && Philostatus[philID].right==10) + printf("Philosopher %d completed his dinner\n",philID+1); + //if already completed dinner + else if(Philostatus[philID].left==1 && Philostatus[philID].right==1){ + //if just taken two forks + printf("Philosopher %d completed his dinner\n",philID+1); + + Philostatus[philID].left = Philostatus[philID].right = 10; //remembering that he completed dinner by assigning value 10 + int otherFork = philID-1; + + if(otherFork== -1) + otherFork=(n-1); + + ForkAvil[philID].taken = ForkAvil[otherFork].taken = 0; //releasing forks + printf("Philosopher %d released fork %d and fork %d\n",philID+1,philID+1,otherFork+1); + compltedPhilo++; + } + else if(Philostatus[philID].left==1 && Philostatus[philID].right==0){ //left already taken, trying for right fork + if(philID==(n-1)){ + if(ForkAvil[philID].taken==0){ //KEY POINT OF THIS PROBLEM, THAT LAST PHILOSOPHER TRYING IN reverse DIRECTION + ForkAvil[philID].taken = Philostatus[philID].right = 1; + printf("Fork %d taken by philosopher %d\n",philID+1,philID+1); + }else{ + printf("Philosopher %d is waiting for fork %d\n",philID+1,philID+1); + } + }else{ //except last philosopher case + int dupphilID = philID; + philID-=1; + + if(philID== -1) + philID=(n-1); + + if(ForkAvil[philID].taken == 0){ + ForkAvil[philID].taken = Philostatus[dupphilID].right = 1; + printf("Fork %d taken by Philosopher %d\n",philID+1,dupphilID+1); + }else{ + printf("Philosopher %d is waiting for Fork %d\n",dupphilID+1,philID+1); + } + } + } + else if(Philostatus[philID].left==0){ //nothing taken yet + if(philID==(n-1)){ + if(ForkAvil[philID-1].taken==0){ //KEY POINT OF THIS PROBLEM, THAT LAST PHILOSOPHER TRYING IN reverse DIRECTION + ForkAvil[philID-1].taken = Philostatus[philID].left = 1; + printf("Fork %d taken by philosopher %d\n",philID,philID+1); + }else{ + printf("Philosopher %d is waiting for fork %d\n",philID+1,philID); + } + }else{ //except last philosopher case + if(ForkAvil[philID].taken == 0){ + ForkAvil[philID].taken = Philostatus[philID].left = 1; + printf("Fork %d taken by Philosopher %d\n",philID+1,philID+1); + }else{ + printf("Philosopher %d is waiting for Fork %d\n",philID+1,philID+1); + } + } + }else{} +} + +int main(){ + for(i=0;i