5.某银行有人民币储蓄业务由n个柜员负责有1台取号机。
每个顾客进入银行后先取一个号若有人取号则需等他人取完后才能取,取到号后等待叫号
当一个柜员人员空闲下来就叫下一个号。试用P、V操作正确编写柜台人员和顾客进程的程序。
下面是我的回答,是否正确呢?
semaphore m_clerk=1 //柜员自身的互斥
semaphore m_handout_num=1 //取号机的互斥
semaphore m_clerk_ready=0 //柜员是否可以服务
int num_custom=0 //等待的客户数量
int num_clerk=N //空闲的柜员数量
int main()
{
cobegin:
clerk();
custom();
coend:
}
clerk()
{
if(num_custom>0 && num_clerk>0)//检查是否由客户,有则服务
{
P(m_clerk);
num_clerk--;
V(m_clerk_ready);//叫号
V(m_clerk);
//服务
//P(m_clerk);//完毕,释放该柜员资源
//num_clerk++;
//V(m_clerk);
}
}
custom()
{
//客户进入
P(m_handt_num); //拿票
num_custom++;
V(m_handt_num);
//等柜员
P(m_clerk_ready)
//得到服务
P(m_handt_num);//完成服务
num_custom--;
num_clerk++;
V(m_handt_num);
}
我的疑问主要是:一开始如果都是custom函数,假设M个函数运行了(M>N),则会使m_clerk_ready=-M;然后这个时候开始运行clerk函数,由于限制,最多只能N个clerk进入if中,即执行P(m_clerk_ready) N次,那么m_clerk_ready=N-M<0,那么不就是都阻塞了吗?不知道我的疑问是否成立