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...
Implement the following socket programming in C (b) Chat Application using TCP
Implement the following socket programming in C (b) Chat Application using TCP
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.
Problem 2: Evaluate the following postfix expression, using the rules given in Section I of Lab...
Problem 2: Evaluate the following postfix expression, using the rules given in Section I of Lab 10: 1 5 4 – 3 + * 3.   Computer Science
Programming Language Required: C Write a multithreaded program in C (not c++) using the pthread library...
Programming Language Required: C Write a multithreaded program in C (not c++) using the pthread library and dynamic memory(malloc) that multiplies two matrices together. The numbers in the matrices must be read in from a text file. The program should also check if the two matrices are capable of being multiplied together. The amount of threads used has to be dynamic. The user should be able to choose how many threads they wish to use using the command line. Finally,...
ADVERTISEMENT
ADVERTISEMENT
ADVERTISEMENT