• 理发师问题


    理发师问题

    操作系统信号量解决理发师问题:

    1.理发店理有一-位理发师、一把理发椅和n把供等候理发的顾客坐的椅子。
    2.如果没有顾客,理发师便在理发椅上睡觉。
    3.一个顾客到来时,它必须叫醒理发师。
    4.如果理发师正在理发时又有顾客来到,则如果有空椅子可坐,就坐下来等待,否则就离开。

    0...0注释打得挺满的,相信一个月后自己还能看得懂,今天又有新的事儿烦身了就不一一分析过程了QAQ,通过生产者和消费者问题还有读者写者问题理解得挺多了。

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <pthread.h>
    #include <semaphore.h>
    
    
    #define P sem_wait
    #define V sem_post 
    
    #define customersignal &customerSignal
    #define barbersignal &barberSignal
    #define mutex &muteX
    
    
    #define emptychair 10
    
    sem_t customerSignal;
    sem_t barberSignal;
    sem_t muteX;
    
    
    int waitting = 0;
    int sum=50;
    
    /** 理发师进程 **/
    void* Barber(void *p)
    {
        while(sum)
        {   
            sum--;
            printf("理发师正在睡觉
    ");
            P(customersignal);  //如果有客户则为客户服务,起床~
            P(mutex);           //有客户的时候客户会从椅子上起来,等待人数减1
            waitting--;
            
            V(barbersignal);    //理发师资源默认为0,V以后理发师资源为1,顾客开始抢理发师233
            V(mutex);           //此时起来的人就是幸运儿,他抢到了理发师,并释放临界区资源给下一个人
            printf("理发师给顾客剪头发
    ");
        }
    }
    
    /** 顾客进程 **/
    void* Customer(void *p)
    {
        while(sum)
        {
            sum--;
            P(mutex);               //锁住椅子临界区,一次只许进入一个人
            if(waitting<emptychair){
                waitting++;
                printf("已有%d名客户坐在椅子上等待
    ",waitting);
                V(customersignal);  //顾客来了,顾客信号量+1,则理发师被叫醒
                V(mutex);           //释放椅子临界区的资源,给下一个人进入
                P(barbersignal);    //顾客抢到了理发师的资源,开始剪头发
                printf("顾客坐下剪头发
    ");
            }
            else{
                V(mutex);           //顾客人来的时候顾客资源+1,既然位置满了顾客走掉就需要释放掉资源
                printf("顾客看到位置坐不下了,走掉了
    ");
            }
        }
    }
    
    
    int main()
    {
        int i;
        /** 初始化资源个数 **/
        sem_init(customersignal, 0, 0);     //顾客信号量初始为0,一开始没有顾客
        sem_init(barbersignal,0,0);         //理发师信号量初始为0,一开始理发师在碎觉
        sem_init(mutex,0,1);                //椅子的临界区信号量初始为0,一开始椅子是没人坐的
    
        /** 创建一个理发师进程 **/
        pthread_t tidbaber;
        pthread_create(&tidbaber, NULL, Barber, NULL);
    
        /** 创建多个顾客进程 **/
        for(i=0;i<15;i++){
            pthread_t i;
            pthread_create(&i, NULL,Customer, NULL);
        }
        
        /**观察结果后关闭进程**/
        getchar();
        pthread_exit(0);
        return 0;
    }
    
    
  • 相关阅读:
    编码 unicode与utf8
    For WeiWei Server Code
    C#枚举
    一些关于java的笔记
    当众讲话第三章当众讲话的语言要求
    当众讲话第四章当众讲话出彩的资本
    会计要素和会计平衡公式
    当众讲话第一章 当众讲话的八项训练
    金蝶KIS标准版会计软件简单使用
    做事的科学细节与流程》读书笔记第一章
  • 原文地址:https://www.cnblogs.com/lightice/p/12774615.html
Copyright © 2020-2023  润新知