理发师问题

理发师问题

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

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("理发师正在睡觉\n");
        P(customersignal);  //如果有客户则为客户服务,起床~
        P(mutex);           //有客户的时候客户会从椅子上起来,等待人数减1
        waitting--;
        
        V(barbersignal);    //理发师资源默认为0,V以后理发师资源为1,顾客开始抢理发师233
        V(mutex);           //此时起来的人就是幸运儿,他抢到了理发师,并释放临界区资源给下一个人
        printf("理发师给顾客剪头发\n");
    }
}

/** 顾客进程 **/
void* Customer(void *p)
{
    while(sum)
    {
        sum--;
        P(mutex);               //锁住椅子临界区,一次只许进入一个人
        if(waitting<emptychair){
            waitting++;
            printf("已有%d名客户坐在椅子上等待\n",waitting);
            V(customersignal);  //顾客来了,顾客信号量+1,则理发师被叫醒
            V(mutex);           //释放椅子临界区的资源,给下一个人进入
            P(barbersignal);    //顾客抢到了理发师的资源,开始剪头发
            printf("顾客坐下剪头发\n");
        }
        else{
            V(mutex);           //顾客人来的时候顾客资源+1,既然位置满了顾客走掉就需要释放掉资源
            printf("顾客看到位置坐不下了,走掉了\n");
        }
    }
}


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;
}

posted @ 2020-04-25 19:21  碎了的冰  阅读(1251)  评论(0编辑  收藏  举报