麻烦搞清楚卫生间同步的逻辑

时间:2012-05-08 15:02:57

标签: c++ operating-system pthreads semaphore

  

可能重复:
  bathroom synchronization and queue of threads

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

//我的变量

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

  }
}

}

1 个答案:

答案 0 :(得分:0)

好吧,因为awoodland已经与SO上的其他线程相关联,所以很高兴看看它。 为了避免在同一个类中避免重复解决同一问题,我还会问你是否强制使用信号量?

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