2017-03-01 18 views
0

我有一个项目,我必须写伪信号量,从下面的文字:并发编程,我该如何构造一个信号量?

“考虑在一个单一的出租车正在曼联和利物浦的支持者从市中心到周六足球比赛的场景。出租车一次可带四名支持者,携带支持者时总是满员,但在出租车中只有一名支持者独立分开时,情况绝不允许出现,出租车进行多次出行当它第一次到达时,它随机发出信号给两个等待支持者队列中的一个队列,你可以假设每个队列中有一个或多个支持者在发信号时等待,当一个支持者进入出租车时,还有一些房间为更多的支持者在出租车上的支持者(谁刚刚加入出租车)发信号给另一个等待的支持者在队列中,他们也进入出租车。在可能的情况下,支持者将随机选择要发信号的队列,但如果有必要,他们会选择一个特定的队列,以确保没有单个支持者在与相反支持者的出租车中隔离。

最后一名进入出租车的支持者在出租车上完成了一个由四名支持者组成的队伍的信号,告诉出租车司机将他们带到足球场。出租车将他们带到目的地,然后返回重复循环。请注意,只有支持者(不是出租车司机)能够区分谁是曼联的支持者,谁是利物浦的支持者。“

我在申请笔记时遇到了麻烦,网上这种情况下

继承人什么香港专业教育学院迄今所做的:?

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 
+1

你尝试过什么你会得到更多更好的答案如果你展示你的尝试,并证明你已花时间去尝试帮助自己。请参阅[问] –

+0

我试图构建它,但我几乎肯定它不正确。 在这种情况下,它可以是来自联合起来的一名出租车的人的4个支持,来自每组支持者的2个支持者,或者4个利物浦支持者。 不应该有一个场景,其中一组支持者超过另一组。 – 944jmc

+0

对不起,对此新增功能,现在添加到主要问题 – 944jmc

回答

0

这是我能make-

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 
相关问题