C语言 哲学家进餐问题

发布时间 2023-12-16 20:39:40作者: WEI苦手

 

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <time.h>
#include <unistd.h>
#include <pthread.h>
#include <semaphore.h>
#define N 
sem_ t chopsticks[N];//设置5种信 号量,有5种不同类型的资源,每一种有1个, 这样便于理解,因为每个哲学家,
sem_ t m;//最多允许有m(4)个哲学家同时拿起左筷子
int philosophers[N] = {0, 1, 2, 34};//代表5个哲学家的编号
void delay (int len) {
    int i = rand() % len;
    int x;
    while(i>0){    
        x = rand() % len;
        while(x>0){
            x--;
            i--;
        }
    }    
}
void *philosopher (void* arg) {
    int i = *(int *)arg;
    int left = i;//左筷子的编号和哲学家的编号相同
    int right = (i + 1) % N;//右筷子的编号为哲学家编号+1
    while (1) {
        printf("哲学家%d正在思考问题\n”,i);
        delay(60000);
        printf("哲学家%d饿了\n", i);
        sem_ wait(&m);//如果前4个哲学家同时拿起左筷子,第五个不能同时拿起左筷子,保证至少有- -位哲学i
         sem_ wait(&chopsticks[left]);//此时这个哲学家左筷子的信号量-1之后>=θ时,表示能继续执行。
        printf("哲学家%d拿起了%d号筷子,现在只有一-支筷子,不能进餐\n",i, left);
        sem_ wait(&chopsticks[right]);
        printf("哲学家%d拿起了%d号筷子,现在有两支筷子,开始进餐\n", i, right);
        delay( 60000);
        sem_ post(&chopsticks[left]);
        printf("哲学家%d放下了%d号筷子\n",i, left); 
        sem_ post(&m);// 当哲学家释放左筷子时,信号量m+1
        sem_ post(&chopsticks[right]);
        printf("哲学家%d放下了%d号筷子\n",i, right); 
    }
}

int main (int argc, char **argv) {
    srand(time(NULL));
    pthread_ t philo[N];
        //信号量初始化
    for (int i=0; i<N; i++) {
        sem init(&chopsticks[i], 01);
    }
    sem_ init(&m, 0, 4);
        //创建线程
    for (int i=0; i<N; i++) {
        pthread_ create(&philo[i], NULL, philosopher, &philosophers[i]);
    }
        //挂起线程
    for (int i=0; i<N; i++) {
        pthread_ join(philo[i], NULL);
    }
        //销毁信号量
    for (int i=0; i<N; i++) {
        sem_ destroy(&chopsticks[i]);
    }
        sem_ destroy(&m) ;
        return 0;
}