gpt4 book ai didi

c++ - 浴室同步和线程队列

转载 作者:太空宇宙 更新时间:2023-11-04 12:09:29 24 4
gpt4 key购买 nike

我们的作业是浴室同步问题。我一直在努力想弄清楚如何开始。当一个人进入洗手间时我想做什么(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);
}
}

}

最佳答案

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

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

假设有 N ID 为 0 的线程至 N-1 .那么fifo_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);

关于c++ - 浴室同步和线程队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10474566/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com