可能な重複ロジックをfiguing:
bathroom synchronization and queue of threadsトラブル浴室のsyncronizationため
を、私は彼らが私は私の質問に答える助けていない、スタック内の同様の質問を見て、グーグルを使用しています。宿題のために、私は浴室の同期の問題が与えられています。共有バスルーム、女性は男性がそこにいる間は使用できず、その逆もあります。私が把握しようとしているのは、他のセックスがバスルームにある場合にスレッドを停止して再起動する方法です。これまでのところ、異性の誰もそこにいない場合、セマフォーに待つように指示するいくつかの条件があります。その後、あなたのセックスの誰もがトイレに残っていない場合は、他のセックスを(セマフォが行く)にしておきます。私はスレッドをロックするか、セマフォを待つかに問題があるかどうかわかりません。ここに私のコードです。
//私の変数
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
}
うーん、他の誰かがこの同じ割り当てについて数日前に質問を投稿しました。 –
@SamDufel:http://stackoverflow.com/questions/3850491/mutual-exclusion-and-semaphores(oops 2010!) – Flexo