控制进餐者的数量,实现哲学家进餐问题,c语言版
时间: 2024-05-05 12:20:15 浏览: 92
以下是使用C语言实现哲学家进餐问题的示例代码:
```
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#define N 5 // 哲学家数量
#define LEFT (i+N-1)%N // 左边哲学家的编号
#define RIGHT (i+1)%N // 右边哲学家的编号
sem_t chopsticks[N]; // 筷子的信号量
void *philosopher(void *arg) {
int i = *(int *)arg;
while (1) {
printf("Philosopher %d is thinking.\n", i);
sleep(rand() % 3);
printf("Philosopher %d is hungry.\n", i);
sem_wait(&chopsticks[LEFT]); // 拿起左边筷子
sem_wait(&chopsticks[RIGHT]); // 拿起右边筷子
printf("Philosopher %d is eating.\n", i);
sleep(rand() % 3);
sem_post(&chopsticks[LEFT]); // 放下左边筷子
sem_post(&chopsticks[RIGHT]); // 放下右边筷子
}
}
int main() {
pthread_t tid[N];
int i, id[N];
for (i = 0; i < N; i++) {
sem_init(&chopsticks[i], 0, 1); // 初始化每个筷子的信号量为1
id[i] = i;
pthread_create(&tid[i], NULL, philosopher, &id[i]); // 创建哲学家线程
}
for (i = 0; i < N; i++) {
pthread_join(tid[i], NULL); // 等待所有哲学家线程结束
}
return 0;
}
```
在上面的代码中,我们使用了信号量来控制哲学家拿筷子和放筷子的行为。每个筷子的信号量初始值为1,表示可以被拿起。当一个哲学家想要进餐时,他会先尝试拿起左边的筷子,如果成功,再尝试拿起右边的筷子,如果成功,就可以进餐了。进餐结束后,他会先放下左边的筷子,再放下右边的筷子,然后开始思考。这样可以保证每个哲学家都能有筷子可用,并且不会出现死锁的情况。
阅读全文