理发师问题
操作系统信号量解决理发师问题:
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;
}