Question

In: Computer Science

C programming: Using the following rules of the Dining philosophers problem: • N philosophers spend their...

C programming:

Using the following rules of the Dining philosophers problem:

N philosophers spend their lives thinking and eating rice.

• There are only N chopstick on the table, one between every two philosophers.

• In order to eat, a philosopher needs to get hold of the two chopsticks that are closest to her.

• A philosopher cannot pick up a chopstick that is already taken by a neighbor.

Implement the dining philosophers problem using pthreads and monitor.

Your program should print the philosopher that is eating, the chopsticks that is using and when the philosopher finished eating.

A correct implementation will run like this:

./diningPhilo
Philosopher 0 is eating using:0,1
Philosopher 2 is eating using:2,3
Philosopher 4 is eating using:4,5
Philosopher 8 is eating using:8,9
Philosopher 6 is eating using:6,7
Philosopher 0 finished eating
Philosopher 6 finished eating
Philosopher 6 is eating using:6,7
Philosopher 2 finished eating
...

Solutions

Expert Solution

#include <pthread.h>
#include <semaphore.h>
#include <stdio.h>
#define THINKING 2
#define HUNGRY 1
#define EATING 0

#define LEFT (phnum+n-1)% N

#define RIGHT (phnum+1)%N

int state[N];
int phil[N];

sem_t mutex;
sem_t S[N];

void test(int phnum)
{
   if (state[phnum] == HUNGRY
       && state[LEFT] != EATING
       && state[RIGHT] != EATING)

{
       state[phnum] = EATING;

       sleep(2);

       printf("Philosopher %d is Eating\n", phnum,phnum + 1);
       sem_post(&S[phnum]);
   }
}

// take up chopsticks
void take_fork(int phnum)
{

   sem_wait(&mutex);

   // state that hungry
   state[phnum] = HUNGRY;

   printf("Philosopher %d is Hungry\n", phnum + 1);

   // eat if neighbours are not eating
   test(phnum);

   sem_post(&mutex);

   // if unable to eat wait to be signalled
   sem_wait(&S[phnum]);

   sleep(1);
}

// put down chopsticks
void put_fork(int phnum)
{

   sem_wait(&mutex);
state[phnum] = THINKING;

   printf("Philosopher %d putting fork %d and %d down\n",
       phnum + 1, LEFT + 1, phnum + 1);
   printf("Philosopher %d is thinking\n", phnum + 1);

   test(LEFT);
   test(RIGHT);

   sem_post(&mutex);
}

void finish(int phnum)

{

sem_wait(&mutex);

printf("philosopher %d finished eating\n",phnum);

test(phnum);

sem_post(&mutex);

sem_wait(&s[phnum]);

sleep(1);

}

void* philospher(void* num)
{

   while (1) {

       int* i = num;

       sleep(1);

       take_fork(*i);

       sleep(0);

       put_fork(*i);

sleep(1);

finish(*i);


   }
}

int main()
{

   int i;
   pthread_t thread_id[N];

   // initialize the semaphores
   sem_init(&mutex, 0, 1);

printf("enter the total number of philosophers having in a dinning table : \n");

scanf("%d",&n);

printf("ente the id's of each philosopher: \n");

for (i=0;i<n;i++)

{

scanf("%d",&a[i]);

}

   for (i = 0; i < N; i++)

       sem_init(&S[i], 0, 0);

   for (i = 0; i < N; i++) {

       // create philosopher processes
       pthread_create(&thread_id[i], NULL,
                   philospher, &phil[i]);

       printf("Philosopher %d is thinking\n", i + 1);
   }

   for (i = 0; i < N; i++)

       pthread_join(thread_id[i], NULL);
}


Related Solutions

We consider the dining philosophers problem. If all philosophers pick up their left fork, that causes...
We consider the dining philosophers problem. If all philosophers pick up their left fork, that causes deadlock. Question: If one (and only one) of the philosophers instead tries to pick up their right fork first, can this system still deadlock? Why/ why not?
The purpose of this C++ programming assignment is to practice using an array. This problem is...
The purpose of this C++ programming assignment is to practice using an array. This problem is selected from the online contest problem archive, which is used mostly by college students worldwide to challenge their programming ability and to prepare themselves for attending programming contests such as the prestige ACM International Collegiate Programming Contest. For your convenience, I copied the description of the problem below with my note on the I/O and a sample executable. Background The world-known gangster Vito Deadstone...
Operating Systems: We have learned two methods for the Dining Philosophers Problem. Can you come up...
Operating Systems: We have learned two methods for the Dining Philosophers Problem. Can you come up with other solutions? Make sure your solution works. Wrong solution does not count. (20 points)
Using C programming make one for loop Description For this problem you will be figuring out...
Using C programming make one for loop Description For this problem you will be figuring out if it is more beneficial to pay off your loans first before investing or if you should only make the minimum payments and invest the rest. Some things to pay attention to Interest rates given are annual interests rates but we will be assuming that interest is compounded monthly so the real rates to use will be 1/12 of what we are given We...
C Programming Language (Code With C Programming Language) Problem Title : Which Pawn? Jojo is playing...
C Programming Language (Code With C Programming Language) Problem Title : Which Pawn? Jojo is playing chess himself to practice his abilities. The chess that Jojo played was N × N. When Jojo was practicing, Jojo suddenly saw a position on his chessboard that was so interesting that Jojo tried to put the pieces of Rook, Bishop and Knight in that position. Every time he put a piece, Jojo counts how many other pieces on the chessboard can be captured...
Implement the following socket programming in C (b) Chat Application using TCP
Implement the following socket programming in C (b) Chat Application using TCP
C programming #include <stdio.h> #include <math.h> int main() { printf("============== Problem #1 =================\n"); printf("This should print...
C programming #include <stdio.h> #include <math.h> int main() { printf("============== Problem #1 =================\n"); printf("This should print down from 2 to 0 by 0.1 increments\n"); float f = 2.0; while (f != 0) { printf("%0.1f\n",f); f = f - 0.1; } printf("============== Problem #2 =================\n"); printf("This should find that the average is 5.5\n"); int total_score = 55; int total_grades = 10; double avg = total_score/total_grades; printf("Average: %0.2f\n",avg); printf("============== Problem #3 =================\n"); printf("If the population increases by 2.5 people per second, how...
Using C language Problem description n (n is odd) people sitting around a round table playing...
Using C language Problem description n (n is odd) people sitting around a round table playing a game. In this situation, everyone has a left neighbour and a right neighbour. At the beginning, each of them is holding a whiteboard with an integer number. Now, they are playing a game consisting of several rounds. In each round, everyone will first look at the numbers of his/her left neighbour and right neighbour, then calculate the average of the two numbers, replace...
C++ programming interest using for loops. I'm fairly new to C++ programming. I really don't get...
C++ programming interest using for loops. I'm fairly new to C++ programming. I really don't get for loops, and wanted help with this question. How do I go about it? 1a. Write a program to ask the user for the starting balance of their savings account, what interest rate they are earning, and how many years they are planning to keep the account open. To calculate the new balance, including compounded interest: use a for loop to loop through the...
Solve the following linear programming problem using the dual simplex method: max ? = −?1 −...
Solve the following linear programming problem using the dual simplex method: max ? = −?1 − 2?2 s.t. −2?1 + 7?2 ≤ 6 −3?1 + ?2 ≤ −1 9?1 − 4?2 ≤ 6 ?1 − ?2 ≤ 1 7?1 − 3?2 ≤ 6 −5?1 + 2?2 ≤ −3 ?1,?2 ≥ 0
ADVERTISEMENT
ADVERTISEMENT
ADVERTISEMENT