bathroom synchronization and queue of threads(浴室同步和线程队列)
本文介绍了浴室同步和线程队列的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
对于家庭作业,我们遇到了卫生间同步的问题。我一直在努力想办法从哪里开始。我想做什么,当一个人进入洗手间(PersonEnterRestrrom函数),如果他们是女性,并且没有男性在洗手间,他们进入,如果不是,他们进入排队等待女性。我也想为男人做同样的事情。我试图实现一个包含线程的队列,但无法使其工作。然后在PersLeavesRestRoom函数中。当一个人离开时,如果浴室里没有人,另一个人就会开始排队。这是我的代码,我知道我离得很远,我确实需要一些指导,并且不太熟悉信号量。
//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);
}
}
}
推荐答案
如果您正在寻找先进先出互斥锁,此互斥锁可能会对您有所帮助:
您需要:
互斥体(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);
这篇关于浴室同步和线程队列的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
沃梦达教程
本文标题为:浴室同步和线程队列
基础教程推荐
猜你喜欢
- 设计字符串本地化的最佳方法 2022-01-01
- 您如何将 CreateThread 用于属于类成员的函数? 2021-01-01
- 调用std::Package_TASK::Get_Future()时可能出现争用情况 2022-12-17
- 什么是T&&(双与号)在 C++11 中是什么意思? 2022-11-04
- C++ 程序在执行 std::string 分配时总是崩溃 2022-01-01
- 如何定义双括号/双迭代器运算符,类似于向量的向量? 2022-01-01
- 运算符重载的基本规则和习语是什么? 2022-10-31
- C++ 标准:取消引用 NULL 指针以获取引用? 2021-01-01
- C++,'if' 表达式中的变量声明 2021-01-01
- 如何在 C++ 中处理或避免堆栈溢出 2022-01-01