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