我已经在堆栈中查看了类似的问题并使用谷歌,他们没有帮我回答我的问题。对于家庭作业,我已经得到了浴室同步问题。共用浴室,女性不能使用,而男性则在那里,反之亦然。我想弄清楚的是如果其他性别在浴室里,如何停止并重新启动线程。到目前为止,我有几个条件,如果没有异性的人在那里,如果不是,我告诉信号量等待。然后离开时,如果你的性别没有留在洗手间,让其他性别进入(信号量去)。我不知道如果我在何时锁定线程或让信号量等待时遇到问题。这是我的代码。
//我的变量
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);
}
}
}
答案 0 :(得分:0)
好吧,因为awoodland已经与SO上的其他线程相关联,所以很高兴看看它。 为了避免在同一个类中避免重复解决同一问题,我还会问你是否强制使用信号量?
如果没有,那么只需创建一个队列(先进先出)结构,并将每个进入的人员排队。当新人来时,应用您的浴室可用性逻辑。 此外,当一个人离开浴室时,如果队列不为空,则再次应用浴室逻辑。 这就是你。