0% found this document useful (0 votes)
14 views4 pages

Assignment8

This document contains code for implementing the dining philosophers problem using threads and semaphores. It defines constants for the number of philosophers and states, creates arrays to track philosopher states and IDs, and includes functions for philosophers to take and release forks using semaphores for synchronization. The main function initializes the semaphores, creates philosopher threads that eat a set number of times by alternating between taking and releasing forks, and joins the threads.

Uploaded by

tanayramteke06
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
14 views4 pages

Assignment8

This document contains code for implementing the dining philosophers problem using threads and semaphores. It defines constants for the number of philosophers and states, creates arrays to track philosopher states and IDs, and includes functions for philosophers to take and release forks using semaphores for synchronization. The main function initializes the semaphores, creates philosopher threads that eat a set number of times by alternating between taking and releasing forks, and joins the threads.

Uploaded by

tanayramteke06
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 4

OSSP Assignment 8

Name- Tanay Ramteke


PRN- 22110696
Roll no- 331056
Div- A (A3)

Code:
#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>

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

int state[N]; int phil[N]


= {0,1,2,3,4};

// sem_t is a typedef defined in the header file as (apparently) some variety


of integer. sem_t mutex; sem_t S[N];
int eating_cycles = 1;

void test(int num_of_philosopher)


{
if (state[num_of_philosopher] == HUNGRY && state[LEFT]
!= EATING && state[RIGHT] != EATING)
{
// state that eating
state[num_of_philosopher] = EATING;
sleep(2);

printf("Philosopher %d takes fork %d and %d\n",


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

/* sem_post(&S[num_of_philosopher]) has no effect


during takefork used to wake up
hungry philosophers
during putfork */
sem_post(&S[num_of_philosopher]);
}
}

// take up Forks
void take_fork(int num_of_philosopher)
{

sem_wait(&mutex);

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


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

// eat if neighbours are not eating


test(num_of_philosopher);
sem_post(&mutex);

// if unable to eat wait to be signalled


sem_wait(&S[num_of_philosopher]);

sleep(1);
}

// put down Forks


void put_fork(int num_of_philosopher)
{

sem_wait(&mutex);

// state that thinking


state[num_of_philosopher] = THINKING;
printf("Philosopher %d putting fork %d and %d
down\n",num_of_philosopher +1, LEFT +1, num_of_philosopher +1);
printf("Philosopher %d is thinking\n", num_of_philosopher +1);
test(LEFT); test(RIGHT);

sem_post(&mutex);
}
void *philosopher(void *num) {
int *i = num; int
eating_counter = 0;

while (eating_counter < eating_cycles)

{ sleep(1); take_fork(*i); sleep(0);

put_fork(*i);

eating_counter++;
}
}

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,philosopher, &phil[i]);

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


}
for (i =0; i < N; i++)
{
pthread_join(thread_id[i],NULL);
}
}
Output:

You might also like

pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy