重複の可能性:
バスルームの同期とスレッドのキュー
スタックで同様の質問を見て、グーグルを使用しましたが、私の質問に答えるのに役立ちませんでした。宿題のために、バスルームの同期の問題が与えられました。共用バスルームで、男性がいる間は女性は使用できません。私が理解しようとしているのは、異性がトイレにいる場合にスレッドを停止して再開する方法です。これまでのところ、異性の誰もそこにいない場合は行き、そうでない場合はセマフォに待機するように指示するといういくつかの条件があります。次に、トイレにあなたの性別の誰も残っていない場合、去るときに他の性別を入れます(セマフォに行きます)。スレッドをロックするタイミングやセマフォを待機させるタイミングに問題があるかどうかはわかりません。これが私のコードです。
//私の変数
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);
}
}
}