-4

可能重复:
浴室同步和线程队列

我在堆栈中查看了类似的问题并使用了谷歌,他们没有帮助我回答我的问题。对于家庭作业,我得到了浴室同步问题。共用浴室,男性在其中时女性不能使用,反之亦然。我想弄清楚的是,如果异性在浴室里,如何停止和重新启动线程。到目前为止,我有几个条件,如果没有异性在那里,如果没有,我告诉信号灯等待。然后,如果您的性别中没有一个人留在洗手间,那么离开时让另一个性别进入(信号灯走)。我不知道我是否在何时锁定线程或让信号量等待时遇到问题。这是我的代码。

//我的变量

 sem_t male;
 sem_t female;
 int maleInBath;
 int femaleInBath;
 pthread_mutex_t coutMutex;

//初始化变量

void personInitGlobals()
{
   // LEAVE THIS STATEMENT                                                 
   pthread_mutex_init(&coutMutex, NULL);

   // TODO: Complete this function                                         
   int init=0;
   maleInBath=0;
   femaleInBath=0;
   sem_init(&male, 0, init);
   sem_init(&female, 0, init);
}

//进入卫生间

void personEnterRestroom(int id, bool isFemale)
 {
   // LEAVE THESE STATEMENTS                                               
    pthread_mutex_lock(&coutMutex);
    cout << "Enter: " << id << (isFemale ? " (female)" : " (male)") << endl\;
    pthread_mutex_unlock(&coutMutex);

   // TODO: Complete this function                                         
   if(isFemale && maleInBath==0){
     femaleInBath++;
    }else if(isFemale && maleInBath >0){
      sem_wait(&female);
   }else if(!isFemale && femaleInBath==0){
      maleInBath++;
  }else{
    sem_wait(&male);
  }
}

人离开洗手间

void personLeaveRestroom(int id, bool isFemale)
 {
   // LEAVE THESE STATEMENTS                                               
    pthread_mutex_lock(&coutMutex);
    cout << "Leave: " << id << (isFemale ? " (female)" : " (male)") << endl;
    pthread_mutex_unlock(&coutMutex);

   // TODO: Complete this function                                         
   if(isFemale){
     femaleInBath--;
    if(femaleInBath==0){
      sem_post(&male);

    }
   }else{
     maleInBath--;
     if(maleInBath==0){
     sem_post(&female);

  }
}

}

4

1 回答 1

0

好吧,awoodland 已经链接到 SO 上的另一个线程,所以很高兴看看它。为了避免在同一个班级重复解决同样的问题,我也会问你是否必须使用信号量?

如果没有,那么只需创建一个队列(先入先出)结构并将每个进来的人都放入队列。当新人来时,应用您的浴室可用性逻辑。此外,当一个人离开浴室时,如果队列不为空,则再次应用浴室逻辑。这就是给你的。

于 2012-05-08T15:16:06.620 回答