синхронизация ванной комнаты и очередь потоков

Для домашней работы нам дали проблему синхронизации ванной. Я изо всех сил пытался понять, как начать. Что я хотел бы сделать, когда человек входит в туалет (функция personEnterRestrrom), если он - женщина, и в туалете нет ни одного мужчины, которого он входит, если нет, то он входит в очередь для ожидающих женщин. Я хочу сделать то же самое для мужчин. Я попытался реализовать очередь, которая содержит поток, но не может заставить его работать. Тогда в функции personLeavesRestroom. Когда человек уходит, если никого не осталось в ванной, начинается другая очередь. Вот мой код, я знаю, что я далеко, потому что мне нужно некоторое руководство, и я не очень знаком с семафорами.

<code>//declarations
pthread_mutex_t coutMutex;
int menInBath;
int womanInBath;
int menWaiting;
int womenWaiting;
queue<pthread_mutex_t>men;
queue<pthread_mutex_t>women;


 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 && menInBath<=0)
  {
     womanInBath++;
   }
 else if(isFemale && menInBath>0)
 {
  wait(coutMutex);
  women.push(coutMutex);
}
 else if(!isFemale && womanInBath<=0)
{
  menInBath++;
}
else
{
  wait(coutMutex);
  men.push(coutMutex);
}
</code>

}

<code>   void
    personLeaveRestroom(int id, bool isFemale)  
    {
   // LEAVE THESE STATEMENTS                                                 
    pthread_mutex_lock(&coutMutex);
    cout << "Leave: " << id << (isFemale ? " (female)" : " (male)") << endl;
    pthread_mutex_unlock(&coutMutex);

  if(isFemale)
    womanInBath--;
  if(womanInBath==0)
    {
       while(!men.empty())
         {
           coutMutex=men.front();
           men.pop();
           signal(coutMutex);
         }
     }

}
</code>

Ответы на вопрос(1)

Ваш ответ на вопрос