使用c语言编写实现哲学家就餐问题
时间: 2023-06-24 22:04:39 浏览: 134
哲学家就餐问题是一个经典的并发问题,以下是使用C语言实现的参考代码:
```C
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#define N 5 // 哲学家数量
pthread_mutex_t chopsticks[N]; // 筷子数组
void *philosopher(void *arg) { // 哲学家函数
int number = *(int *)arg;
int left = number; // 左筷子编号
int right = (number + 1) % N; // 右筷子编号
while (1) {
printf("Philosopher %d is thinking\n", number);
sleep(1); // 思考一段时间
printf("Philosopher %d is hungry\n", number);
pthread_mutex_lock(&chopsticks[left]); // 拿起左筷子
printf("Philosopher %d picks up chopstick %d\n", number, left);
pthread_mutex_lock(&chopsticks[right]); // 拿起右筷子
printf("Philosopher %d picks up chopstick %d\n", number, right);
printf("Philosopher %d is eating\n", number);
sleep(1); // 吃一段时间
pthread_mutex_unlock(&chopsticks[left]); // 放下左筷子
printf("Philosopher %d puts down chopstick %d\n", number, left);
pthread_mutex_unlock(&chopsticks[right]); // 放下右筷子
printf("Philosopher %d puts down chopstick %d\n", number, right);
}
}
int main() {
pthread_t philosophers[N];
int numbers[N];
int i;
for (i = 0; i < N; i++) {
pthread_mutex_init(&chopsticks[i], NULL);
numbers[i] = i;
pthread_create(&philosophers[i], NULL, philosopher, &numbers[i]);
}
for (i = 0; i < N; i++) {
pthread_join(philosophers[i], NULL);
}
return 0;
}
```
在主函数中,我们首先初始化筷子数组,并创建哲学家线程。每个哲学家线程都循环执行思考、拿起筷子、吃饭、放下筷子的操作。注意在拿起和放下筷子时要使用互斥锁保证同一时间只有一个哲学家能够拿起筷子。最后我们等待所有哲学家线程运行结束,程序退出。
阅读全文