Linux 下哲学家就餐问题 C 语言实现
以下是一个基于 Linux 环境下的哲学家就餐问题的 C 语言实现:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
#define N 5
pthread_mutex_t forks[N];
pthread_t philosophers[N];
int ids[N] = {0, 1, 2, 3, 4};
void *philosopher(void *arg) {
int id = *(int *) arg;
int left = id;
int right = (id + 1) % N;
while (1) {
// 拿左边的叉子
pthread_mutex_lock(&forks[left]);
printf("Philosopher %d picks up left fork %d\n", id, left);
// 拿右边的叉子
pthread_mutex_lock(&forks[right]);
printf("Philosopher %d picks up right fork %d\n", id, right);
printf("Philosopher %d is eating\n", id);
sleep(1); // 吃饭
// 放下右边的叉子
pthread_mutex_unlock(&forks[right]);
printf("Philosopher %d puts down right fork %d\n", id, right);
// 放下左边的叉子
pthread_mutex_unlock(&forks[left]);
printf("Philosopher %d puts down left fork %d\n", id, left);
printf("Philosopher %d is thinking\n", id);
sleep(1); // 思考
}
}
int main() {
int i;
for (i = 0; i < N; i++) {
pthread_mutex_init(&forks[i], NULL);
}
for (i = 0; i < N; i++) {
pthread_create(&philosophers[i], NULL, philosopher, &ids[i]);
}
for (i = 0; i < N; i++) {
pthread_join(philosophers[i], NULL);
}
for (i = 0; i < N; i++) {
pthread_mutex_destroy(&forks[i]);
}
return 0;
}
在这个实现中,每个哲学家被表示为一个线程。每个线程执行一个无限循环,在循环中,哲学家会先尝试拿起左边的叉子,然后尝试拿起右边的叉子。如果拿起叉子成功,哲学家就会开始吃饭,吃完饭之后放下右边的叉子,再放下左边的叉子,开始思考。
每个叉子被表示为一个互斥锁。在拿起叉子时,哲学家会尝试获取左边的叉子的互斥锁,如果获取成功,则会继续尝试获取右边的叉子的互斥锁。如果获取右边的叉子的互斥锁失败,则会放下左边的叉子,等待一段时间后再次尝试获取左边的叉子的互斥锁。
在程序结束时,需要释放所有的叉子的互斥锁。
原文地址: https://www.cveoy.top/t/topic/nA6U 著作权归作者所有。请勿转载和采集!