首页 > 其他分享 >C语言 哲学家进餐问题

C语言 哲学家进餐问题

时间:2023-12-16 20:45:04浏览次数:29  
标签:进餐 哲学家 int printf C语言 筷子 sem include

 

#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, 3,4};//代表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], 0,1);
    }
    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;
}

 

标签:进餐,哲学家,int,printf,C语言,筷子,sem,include
From: https://www.cnblogs.com/wei-1024/p/17908343.html

相关文章

  • 《初学C语言第29天》
    //////————————8.回调函数////回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个////函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数////的实现方直接调用,而是在特定的事件或条件发生时由另......
  • C语言数组
    数组----一组相同类型分元素的集合。第一个intarr[10]叫完全初始化;第二个charch[5]叫不完全初始化,剩余的默认为零。输出结果如下:可以看到,下标是从0开始的,就是最左边一列的数字。数组使用下标来访问的。......
  • C语言如何处理scanf输入函数不安全的问题?
    要不看到这个警告,只需在整个代码的第一行输入:这样scanf函数就不会报错了。......
  • C语言循环语句
    首先根据题意画出示意图来,例如:然后用while()或for()语句,注意嵌套和各种情况......
  • C语言函数的递归
    C语言是一种非常强大的编程语言,它具有丰富的功能和灵活的语法。其中,函数递归是C语言中一个非常重要的概念,它能够让我们在编写程序时更加高效和简洁。在本文中,我们将深入探讨C语言函数递归的原理和用法。首先,让我们来了解一下函数递归的概念。函数递归是指一个函数在其函数体内调用......
  • 《初学C语言第28天》
    ////////————————6.函数指针数组//////函数指针数组//////数组是一个存放相同类型数据的存储空间,那我们已经学习了指针数组,//////比如:int*arr[10];数组的每个元素是int*//////那要把函数的地址存到一个数组中,那这个数组就叫函数指针数组,那函数指针的数组如何定义呢?//......
  • c语言递归函数
    @TOC前言一、递归的理解:递归函数:函数自己调用自己的,叫做递归调用。例如:voidfun(void){printf("Hellow!");fun();}二、循环角度理解递归:递归的本质就是循环。循环可以完全代替递归,但是递归在某些情况下代码会更简洁一点。可控递归三要素:voidfun(inti)//1.循环控制变......
  • 实验6 c语言结构体,枚举应用编程
    task4源代码1#include<stdio.h>2#include<string.h>3#defineN1045typedefstruct{6charisbn[20];//isbn号7charname[80];//书名8charauthor[80];//作者9doublesales_price;//......
  • 实验6_C语言结构体、枚举应用编程
    4.task_41#include<stdio.h>2#defineN1034typedefstruct{5charisbn[20];6charname[80];7charauthor[80];8doublesales_price;9intsales_count;10}Book;1112voidoutput(Bookx[],intn);13voids......
  • 实验6 C语言结构体、枚举应用编程
    实验任务41#include<stdio.h>2#defineN1034typedefstruct{5charisbn[20];//isbn号6charname[80];//书名7charauthor[80];//作者8doublesales_price;//售价9intsales_count;......