PV操作:对信号量进行相应操作
S:信号量
P:请求操作,相当于S=S-1;S>=0,进程继续进行
V:释放操作,相当于S=S+1,S>0,进程被唤醒
理发师问题
一个理发师,一把理发椅,n把等候理发的顾客椅子,如果没有顾客则理发师便在理发椅上睡觉 ,当有一个顾客到达时,首先看理发师在干什么,如果理发师在睡觉,则唤醒理发师理发,如果理发师正在理发,则查看是否有空的顾客椅子可坐, 如果有,坐下等待,如果没有,则离开。定义信号量:wait=0:顾客信号量 barber=0:理发师信号量
custNum:当前顾客数量 mutex=1:互斥量
理发师操作:
Barber(){
while(1){
P(wait); //唤醒等待的一位顾客
P(mutex); //顾客被唤醒,准备理发,没有顾客,则睡觉
custNum--; //当前店里顾客数减1
V(barber); //有顾客来了,醒来理发
V(mettux): //释放互斥信号量
}
}
顾客操作:
Customer(){
while(1){
P(mutex); //顾客想要理发
if(custNum<N){ //店里人没有满
custNum++;
V(wait); //理发师睡觉的话,唤醒他理发
V(mutex); //释放互斥量,理发这一动作成功
P(baber); //理发师进行理发操作
}
else
{
V(metux); //释放互斥量,打消进店理发的举动
}
}
}