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

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...
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...
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
Using C++ use dynamic programming to list first 30 Fibonacci numbers. Fibonacci sequence is famous problem...
Using C++ use dynamic programming to list first 30 Fibonacci numbers. Fibonacci sequence is famous problem solved with recursion. However, this can also be done more efficiently using dynamic programming. Create a program that uses dynamic programming techniques to list the first 30 Fibonacci numbers.
The solution of a linear programming problem using Microsoft Excel typically involves the following three stages:...
The solution of a linear programming problem using Microsoft Excel typically involves the following three stages: a. formulating the problem, graphing the problem, and sensitivity analysis b. the changring cells, the target cells, and the constraints c. the inputs, the changing cells, and the outputs d. forumulating the problem, invoking Solver, and sensitivity analysis
[15 marks] Draw the flowchart of the following programming problem: You can draw the flowchart using...
[15 marks] Draw the flowchart of the following programming problem: You can draw the flowchart using a drawing tool, or draw the flowchart on a piece of paper, take a picture, insert it here or save it in the submission folder The program reads an unspecified number of integers until a zero is entered. While the program reads each number it counts the number of positive numbers and the number of negative numbers that have been entered and sum up...
Solve the following linear programming problem using Solver. Be sure to write in your optimal solution...
Solve the following linear programming problem using Solver. Be sure to write in your optimal solution below the problem. Max Z = 20X1 + 30X2 + 25X3 + 32X4 s.t. 4X1 + 8X2 + 5X3 + 6X4 ≤ 40 X1 + X2 ≥ 3 (X1 + X2) ≤ (X3 + X4) ?1 ?2 ≥ 3 2 X1 = __________ X2 = ___________ X3 = ___________ X4 = ___________ Z = ____________
ADVERTISEMENT
ADVERTISEMENT
ADVERTISEMENT