1

对于家庭作业,我们得到了浴室同步问题。我一直在努力弄清楚如何开始。当一个人进入洗手间时我想做什么(personEnterRestrrom 函数),如果他们是女性并且没有男性在他们进入的洗手间,如果不是,他们会排队等待女性。我想为男人做同样的事情。我试图实现一个包含线程的队列,但无法让它工作。然后在 personLeavesRestroom 函数中。当一个人离开,如果没有人留在浴室里,另一个队列就开始了。这是我的代码,我知道我很遥远,因为我确实需要一些指导并且对信号量不是很熟悉。

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

}

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

}
4

1 回答 1

1

如果您正在寻找 FIFO 互斥体,这个可以帮助您:

您将需要:
互斥体( pthread_mutex_t mutex)、
条件变量数组( std::vector<pthread_cond_t> cond)
用于存储线程 ID 的队列( std::queue<int> fifo)。

假设有 ID 为的N线程。然后看起来像这样(伪代码):0N-1fifo_lock()fifo_unlock()

fifo_lock()
    tid = ID of this thread;
    mutex_lock(mutex);
    fifo.push(tid); // puts this thread at the end of queue

    // make sure that first thread in queue owns the mutex:
    while (fifo.front() != tid)
        cond_wait(cond[tid], mutex);

    mutex_unlock(mutex);

fifo_unlock()
    mutex_lock(mutex);
    fifo.pop(); // removes this thread from queue

    // "wake up" first thread in queue:
    if (!fifo.empty())
        cond_signal(cond[fifo.front()]);

    mutex_unlock(mutex);
于 2012-05-06T22:34:17.863 回答