PV操作问题请教,谁是这方面的爱好者

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,那么不就是都阻塞了吗?不知道我的疑问是否成立