以下是一个基于 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;
}

在这个实现中,每个哲学家被表示为一个线程。每个线程执行一个无限循环,在循环中,哲学家会先尝试拿起左边的叉子,然后尝试拿起右边的叉子。如果拿起叉子成功,哲学家就会开始吃饭,吃完饭之后放下右边的叉子,再放下左边的叉子,开始思考。

每个叉子被表示为一个互斥锁。在拿起叉子时,哲学家会尝试获取左边的叉子的互斥锁,如果获取成功,则会继续尝试获取右边的叉子的互斥锁。如果获取右边的叉子的互斥锁失败,则会放下左边的叉子,等待一段时间后再次尝试获取左边的叉子的互斥锁。

在程序结束时,需要释放所有的叉子的互斥锁。

Linux 下哲学家就餐问题 C 语言实现

原文地址: https://www.cveoy.top/t/topic/nA6U 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录