信号量解决哲学家问题代码C语言
时间: 2023-08-22 08:05:11 浏览: 101
哲学家问题可以使用信号量来解决。下面是一个使用 C 语言编写的哲学家问题的解决方案:
```c
#include <stdio.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]; // 信号量数组,表示筷子的状态
sem_t mutex; // 互斥信号量,保证哲学家就餐的互斥
void *philosopher(void *arg) {
int i = *(int *)arg;
int left = LEFT;
int right = RIGHT;
while (1) {
// 哲学家思考
printf("Philosopher %d is thinking.\n", i);
// 等待左边的筷子
sem_wait(&chopsticks[left]);
// 等待右边的筷子
sem_wait(&chopsticks[right]);
// 获取互斥锁
sem_wait(&mutex);
// 哲学家就餐
printf("Philosopher %d is eating.\n", i);
// 释放互斥锁
sem_post(&mutex);
// 放下左边的筷子
sem_post(&chopsticks[left]);
// 放下右边的筷子
sem_post(&chopsticks[right]);
}
}
int main() {
pthread_t tid[N];
int index[N];
// 初始化互斥信号量
sem_init(&mutex, 0, 1);
// 初始化筷子信号量
for (int i = 0; i < N; i++) {
sem_init(&chopsticks[i], 0, 1);
}
// 创建哲学家线程
for (int i = 0; i < N; i++) {
index[i] = i;
pthread_create(&tid[i], NULL, philosopher, &index[i]);
}
// 等待哲学家线程结束
for (int i = 0; i < N; i++) {
pthread_join(tid[i], NULL);
}
// 销毁信号量
sem_destroy(&mutex);
for (int i = 0; i < N; i++) {
sem_destroy(&chopsticks[i]);
}
return 0;
}
```
在这个代码中,我们使用了一个互斥信号量 `mutex` 来保证哲学家之间的就餐互斥。每个哲学家都需要先获取左边的筷子,再获取右边的筷子,然后才能进餐。如果一个筷子被其他哲学家占用,则当前哲学家会等待,直到可以获取到筷子。就餐完成后,哲学家会先放下左边的筷子,再放下右边的筷子,然后继续思考。
阅读全文