#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#define NUM_PHILOSOPHERS 5
pthread_mutex_t chopsticks[NUM_PHILOSOPHERS];
pthread_t philosophers[NUM_PHILOSOPHERS];
void *philosopher(void *arg) {
int philosopher_id = *((int *)arg);
int left_chopstick = philosopher_id;
int right_chopstick = (philosopher_id + 1) % NUM_PHILOSOPHERS;
while (1) {
// Try to acquire the left chopstick
pthread_mutex_lock(&chopsticks[left_chopstick]);
printf("Philosopher %d picks up left chopstick\n", philosopher_id);
// Try to acquire the right chopstick
pthread_mutex_lock(&chopsticks[right_chopstick]);
printf("Philosopher %d picks up right chopstick\n", philosopher_id);
// Philosopher is eating
printf("Philosopher %d is eating\n", philosopher_id);
// Release the chopsticks
pthread_mutex_unlock(&chopsticks[left_chopstick]);
printf("Philosopher %d releases left chopstick\n", philosopher_id);
pthread_mutex_unlock(&chopsticks[right_chopstick]);
printf("Philosopher %d releases right chopstick\n", philosopher_id);
// Philosopher is thinking
printf("Philosopher %d is thinking\n", philosopher_id);
}
return NULL;
}
int main() {
int i;
// Initialize the chopsticks (mutexes)
for (i = 0; i < NUM_PHILOSOPHERS; i++) {
pthread_mutex_init(&chopsticks[i], NULL);
}
// Create philosopher threads
for (i = 0; i < NUM_PHILOSOPHERS; i++) {
int *philosopher_id = malloc(sizeof(int));
*philosopher_id = i;
pthread_create(&philosophers[i], NULL, philosopher, philosopher_id);
}
// Wait for philosopher threads to finish (will never happen in this case)
for (i = 0; i < NUM_PHILOSOPHERS; i++) {
pthread_join(philosophers[i], NULL);
}
// Cleanup
for (i = 0; i < NUM_PHILOSOPHERS; i++) {
pthread_mutex_destroy(&chopsticks[i]);
}
return 0;
}