我试图模拟餐饮哲学家的问题,但我在查看它时遇到了麻烦。当线程从Waiting()移动到Eating()到Thinking()时,它会更改一个名为state的变量来表示它。但是在我的主线程中它从未看到状态变量发生变化。当绘图改变哲学家的颜色时,它会调用状态的返回函数。
对此有何帮助?
这是一些代码: 国家变化
void Philosopher::Eat()
{
state_ = EATING;
Sleep(500);
}
返回功能
Philosopher::_state Philosopher::ReturnState()
{
return state_;
}
回程函数
Philosopher::_state current_state_;
current_state_ = philosopher_[i].ReturnState();
switch (current_state_)
{
case Philosopher::PICKING:
{
glColor3f(1, 0, 0);
break;
}
case Philosopher::EATING:
{
glColor3f(0, 1, 0);
break;
}
case Philosopher::THINKING:
{
glColor3f(0, 0, 1);
break;
}
}
答案 0 :(得分:1)
如果没有同步,尝试从多个线程访问一个变量是Undefined Behavior。添加互斥锁。
答案 1 :(得分:1)
因为这是我能找到的唯一问题:
对此有何帮助?
这个问题现在已经有6个月了,我想我会展示如何做到这一点。实际上这里有四种方法(在C ++中):
简单的答案是创建一个.
数组,它代表每个哲学家之间的分支并使用std::mutex
锁定它们(用于进食),如下所示:
std::lock
如果你这样做,并且你发现你的代码花费了大量的时间,那么就向你的std :: lib供应商写一个bug报告并指出它们。他们会认出来的。
或者,如果您愿意,只需将四个std::unique_lock<std::mutex> left (mutexes[i], std::defer_lock);
std::unique_lock<std::mutex> right(mutexes[j], std::defer_lock);
std::lock(left, right);
实现中的一个复制出来(无论哪个最适合您)并使用它。