首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >并发编程,我如何构造一个信号量?

并发编程,我如何构造一个信号量?
EN

Stack Overflow用户
提问于 2017-03-01 21:00:08
回答 1查看 204关注 0票数 0

我有一个项目,我必须从下面的文本中为信号量编写伪代码:

“想象一下这样一个场景:一辆出租车载着曼彻斯特联队和利物浦的支持者从市中心去看周六的足球比赛。出租车一次可以搭载四名支持者,当搭载支持者时,出租车总是满员。然而,这种情况是永远不允许发生的,如果出租车包含任何一个单独的球队的支持者。出租车进行了多次旅行,当它第一次到达时,它会随机向等待的两个支持者中的一个发出信号。您可以假设,当队列发出信号时,每个队列中总是有一个或多个支持者在等待。当一名支持者进入出租车时,出租车上还有一些空间可以容纳更多的支持者,该支持者(刚刚加入出租车)向排队等候的另一名支持者发出信号,让他们也进入出租车。在可能的情况下,支持者将随机选择队列发信号,但如果有必要,他们将选择特定的队列,以确保不会有单个支持者与对立的支持者隔离在出租车上。

最后一名支持者进入出租车,完成出租车上四名支持者的全部队列,向出租车(司机)示意将他们带到足球场。出租车把他们送到目的地,然后回来重复这个循环。请注意,只有支持者(而不是出租车司机)能够区分谁是曼彻斯特联队的支持者,谁是利物浦的支持者。

我在应用我的笔记以及在线对此场景的帮助时遇到了问题。

这是我到目前为止所做的:

代码语言:javascript
运行
复制
int numManInTaxi = 0; //current no. of ManU supporters in taxi  
int numLivInTaxi = 0;

sem MaxUnitedFans = 4; // // max no. of supporters that can fit in taxi
sem MaxLivFans = 4;

sem MMutexSem = 1;
sem LMutexSem = 1;

CO
for (count = 1 to ManUSupporter){
ManUProcess[count];

// 
for (count = 1 to LivSupporter){
LivProcess[count];
OC
} /*end main process


process ManUProcess [i = 1 to N]{

P(MMutexSem); // mutually exclusice access for United supporter
numManUInTaxi++;

if ((numManInTaxi+numLivInTaxi) < 4) 
  {    
if (numManuInTaxi == 3) { // signal the Man queue
numManUInTaxi++;
} else if ((numManUInTaxi ==1) && (numLivInTaxi==2)){
numManUInTaxi++;
}   else if ( (numManInTaxi == 2) &&(numLivInTaxi==1)) {
V(MMutexSem); 
NumLivInTaxi++;}

//end ManU supporter semaphore
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-21 04:16:38

这是我能做的-

代码语言:javascript
运行
复制
int numManInTaxi = 0;   //current no. of ManU supporters in taxi  
int numLivInTaxi = 0;
int seats=4;            //no of seats available empty

sem taxi=1;             //to wait for taxi to send signal
sem seats=0;            //signal generated by taxi or passenger for next passenger

wait(taxi);             //taxi is available
{
    signal(seat);       //taxi generates signal

    while(wait(seats))  //check if there are seats available
    {
       int i=rand()%2;  //random number 0 or 1 used to select between 2 queues

       if(i==0)
        numManInTaxi++; //passenger supports ManU
       else
        numLivInTaxi++; //passenger supports Liv

       seats--;
       if(seats>1)      //passenger generates signal for next passenger to enter
           signal(seat);
    }


    /*Now three seats are filled and we have one empty seat left which is to
      be filled such that there is no lone supporter of a team in taxi*/


    signal(seat);       //signal for last seat

    wait(seat);         //last passenger recieves the signal
     seats--;
    if(numManInTaxi==1) //if only one supporter belongs to ManU
        numManInTaxi++;
     else
        numManInTaxi++; 
}




 //taxi drops passengers
 numManInTaxi=0;
 numManInTaxi=0;
 seats=4;
 signal(taxi);   //taxi is ready for next trip
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42532458

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档