can someome investigate my program that utilizes semaphores that can result in deadlock due to programming...

80.2K

Verified Solution

Question

Programming

can someome investigate my program that utilizes semaphores that can result in deadlock due toprogramming errors and help in finding out if the solution meet all criteria for thecritical section
  • If yes, then comment code identifying the parts of code thatdo
  • If no, could you help in fixing the code wherever givensolution fails criteria in the code below

#include
#include
#include
#include

#define N 5
#define THINKING 2
#define HUNGRY 1
#define EATING 0
#define LEFT (phnum + 4) % N
#define RIGHT (phnum + 1) % N

int state[N];
int phil[N] = { 0, 1, 2, 3, 4 };

sem_t mutex;
sem_t S[N];

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

sleep(2);

printf(\"Philosopher %d takes fork %d and %d\n\",
phnum + 1, LEFT + 1, phnum + 1);

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

// sem_post(&S[phnum]) has no effect
// during takefork
// used to wake up hungry philosophers
// during putfork
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 that thinking
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* philospher(void* num)
{

while (1) {

int* i = num;

sleep(1);

take_fork(*i);

sleep(0);

put_fork(*i);
}
}

int main()
{

int i;
pthread_t thread_id[N];

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

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);
}

Answer & Explanation Solved by verified expert
4.4 Ratings (717 Votes)
Here only a slight change needed to be made to handle the case in which lets say suppose we have 4 philosopher and after each one of them picks their left fork then context switch occurs and we go to next philosopher that is after philosopher0 has picked the left fork of index 0 then context switch occurs and we go to philosopher1 who also captures its    See Answer
Get Answers to Unlimited Questions

Join us to gain access to millions of questions and expert answers. Enjoy exclusive benefits tailored just for you!

Membership Benefits:
  • Unlimited Question Access with detailed Answers
  • Zin AI - 3 Million Words
  • 10 Dall-E 3 Images
  • 20 Plot Generations
  • Conversation with Dialogue Memory
  • No Ads, Ever!
  • Access to Our Best AI Platform: Flex AI - Your personal assistant for all your inquiries!
Become a Member

Other questions asked by students