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?
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)
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...
*C PROGRAMMING LANGUAGE* a) Given an array of size n, sort the array using pointers using...
*C PROGRAMMING LANGUAGE* a) Given an array of size n, sort the array using pointers using malloc or calloc. Examples: Input: n = 5, A= {33,21,2,55,4} Output: {2,4,21,33,55} b) Write a function that declares an array of 256 doubles and initializes each element in the array to have a value equal to half of the index of that element. That is, the value at index 0 should be 0.0, the value at index 1 should be 0.5, the value at...
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...
Part1: Write a program in C/C++ to solve the 0/1 knapsack problem using (i) Dynamic Programming...
Part1: Write a program in C/C++ to solve the 0/1 knapsack problem using (i) Dynamic Programming based algorithm and (ii) Branch and Bound Search based algorithm Go through the related text and implement each of these algorithms using the efficient data structure. Show the results of different steps of these algorithms for an instance of the 0/1 Knapsack problem with number of items, n=4. The capacity of the knapsack, weights and profits of the items may be generated randomly with...
Using C language, and describe the algorithm design Q2 Problem description n (n is odd) people...
Using C language, and describe the algorithm design Q2 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...
C PROGRAMMING LANGUAGE Problem title : Bibi's Array Bibi also has an array containing N elements....
C PROGRAMMING LANGUAGE Problem title : Bibi's Array Bibi also has an array containing N elements. Like Lili, Bibi wants to know the highest frequency (most occurrences) and all elements which have that frequency. Format Input The first line contains an integer T stating the number of test cases. For each test case, the first line contains a single integer N which indicate the number of element in the array. The next line contains N integers Xi (1≤ i ≤...
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...
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...
ADVERTISEMENT
ADVERTISEMENT
ADVERTISEMENT