睡眠理发师问题的扩充 40

1.编写程序实现理发师与顾客进程的同步。问题描述:这是另一种经典的IPC问题,理发店有一位理发师,一把理发椅和n把用来等候理发的椅子。如果没有顾客,则更好师便在理发椅上睡... 1.编写程序实现理发师与顾客进程的同步。
问题描述:这是另一种经典的IPC问题,理发店有一位理发师,一把理发椅和n把用来等候理发的椅子。如果没有顾客,则更好师便在理发椅上睡觉,顾客到来时,如理发师闲则理发,否则如有空等候椅则坐等,没有空椅则离开,编写程序实现理发师和顾客程序,实现进程控制,要求不能出现竞争。
2.将1题中问题修改为有两位理发师,设计程序实现同步控制。
问题提示:可以用一个变量waiting来记录等候理发的顾客数,另使用三个信号量:用来记录等候理发的顾客数customers;用来记录理发师是否空闲的信息号量barbers,一个用于互斥访问waiting变量的mutex。
1已经做好了,只是想把理发师扩充问两个,求助!
DWORD WINAPI customer(LPVOID pParm2) //顾客的线程
{

::WaitForSingleObject(Mutex ,INFINITE); //p(mutex)来进行互斥操作
count++; //来的是第几个顾客
cout<<"叮咚!第 "<<count<<" 个顾客来了 "<<endl;
if (waiting<chairs) //如果还有椅子可以坐
{
if (waiting!=0){
cout<<"此时有"<<waiting <<" 个人在等待理发"<<endl;
}
else
cout<<"没有人在等待"<<endl; //输出有多少人在等待
waiting++;
cout<<"还有"<<chairs-waiting+1<<"个座位"<<endl;
cout<<"有座位,顾客已经坐下"<<endl;
::ReleaseSemaphore(customers,1,NULL);//v(customer)
::ResumeThread(customers);//唤醒理发师进程
::ReleaseMutex(Mutex);//释放互斥量,以便其他线程使用

::WaitForSingleObject(barbers1,INFINITE);//等待理发
gethaircut(); //理发并离开
}
else
{

cout<<"座位已满,第"<<count<<"个顾客离开"<<endl; //没有椅子,顾客直接离开
::ReleaseMutex(Mutex);
}
return 0;
}
展开
 我来答
kinch_ttp
2010-01-07 · 超过11用户采纳过TA的回答
知道答主
回答量:35
采纳率:0%
帮助的人:26.5万
展开全部
这个简单,你做1的时候不是应该已经用了一个计数信号量了吗(数有几个人等着),在2里你也用一个计数信号量数有几个空闲的理发师就可以了。

看起来没有问题,只要那个barber1的maximumCount等于2就可以了,这样就能有两个customer同时理发了,因为第一个p(barber)得到一个barber,barber的计数下降为1,然后第二个p(barber)还能再得到一次。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式