#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) {
//拿起左边的筷子
pthread_mutex_lock(&chopsticks[left_chopstick]);
printf("Philosopher %d picks up left chopstick\n", philosopher_id);
// 拿起右边的筷子
pthread_mutex_lock(&chopsticks[right_chopstick]);
printf("Philosopher %d picks up right chopstick\n", philosopher_id);
// 进餐
printf("Philosopher %d is eating\n", philosopher_id);
// 放下筷子
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);
// 思考
printf("Philosopher %d is thinking\n", philosopher_id);
}
return NULL;
}
int main() {
int i;
// 初始化 chopsticks (mutexes)
for (i = 0; i < NUM_PHILOSOPHERS; i++) {
pthread_mutex_init(&chopsticks[i], NULL);
}
//创造哲学家线程
for (i = 0; i < NUM_PHILOSOPHERS; i++) {
int *philosopher_id = malloc(sizeof(int));
*philosopher_id = i;
pthread_create(&philosophers[i], NULL, philosopher, philosopher_id);
}
// 等待哲学家线程结束
for (i = 0; i < NUM_PHILOSOPHERS; i++) {
pthread_join(philosophers[i], NULL);
}
// 销毁线程
for (i = 0; i < NUM_PHILOSOPHERS; i++) {
pthread_mutex_destroy(&chopsticks[i]);
}
return 0;
}
#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) {
//拿起左边的筷子
if (pthread_mutex_trylock(&chopsticks[left_chopstick]) == 0) {
printf("Philosopher %d picks up left chopstick\n", philosopher_id);
// 拿起右边的筷子
if (pthread_mutex_trylock(&chopsticks[right_chopstick]) == 0) {
printf("Philosopher %d picks up right chopstick\n", philosopher_id);
//进餐
printf("Philosopher %d is eating\n", philosopher_id);
// 放下筷子
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);
// 思考
printf("Philosopher %d is thinking\n", philosopher_id);
} else {
// 拿到了左边的筷子而没拿到右边的就放下刚刚拿到的左边的筷子
pthread_mutex_unlock(&chopsticks[left_chopstick]);
}
}
// 让其他哲学家线程先运行
sched_yield();
}
return NULL;
}
int main() {
int i;
// 初始化 chopsticks (mutexes)
for (i = 0; i < NUM_PHILOSOPHERS; i++) {
pthread_mutex_init(&chopsticks[i], NULL);
}
// 创建哲学家线程
for (i = 0; i < NUM_PHILOSOPHERS; i++) {
int *philosopher_id = malloc(sizeof(int));
*philosopher_id = i;
pthread_create(&philosophers[i], NULL, philosopher, philosopher_id);
}
// 等待哲学家线程结束
for (i = 0; i < NUM_PHILOSOPHERS; i++) {
pthread_join(philosophers[i], NULL);
}
//销毁线程
for (i = 0; i < NUM_PHILOSOPHERS; i++) {
pthread_mutex_destroy(&chopsticks[i]);
}
return 0;
}