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