-4

重複の可能性:
バスルームの同期とスレッドのキュー

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

//私の変数

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

  }
}

}

4

1 に答える 1

0

まあ、awoodland はすでに SO の他のスレッドにリンクしているので、見てみるといいでしょう。念のため、同じクラスの同じ問題に対する重複した解決策を避けるために、セマフォの使用が必須かどうかもお尋ねします??

そうでない場合は、キュー (先入れ先出し) 構造を作成し、入ってくるすべての人をキューに入れます。新しい人が来たら、バスルームの空き状況ロジックを適用します。また、人がトイレを出るときに、キューが空でない場合はトイレのロジックを再度適用します。以上です。

于 2012-05-08T15:16:06.620 に答える