1

我正在尝试模拟餐饮哲学家的问题,但我无法将其可视化。当线程从 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;
        }
    }
4

2 回答 2

1

如果没有同步,尝试从多个线程访问一个变量是未定义行为。添加互斥锁。

于 2015-05-13T11:34:05.267 回答
1

因为这是我能找到的唯一问题:

有什么帮助吗?

这个问题现在已经 6 个月大了,我想我会展示如何去做。实际上这里有四种方法(在 C++ 中):

餐饮哲学家重新启动

简单的答案是创建一个数组,std::mutex其中代表每个哲学家之间的叉子并使用 锁定它们(用于进食)std::lock,如下所示:

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

如果您这样做,并且您发现您的代码花费大量时间旋转,请向您的 std::lib 供应商写一份错误报告并将他们指向本文。他们会认出它。

或者,如果您愿意,只需从论文中复制四种::lock实现中的一种(选择最适合您的一种)并使用它。

于 2015-11-06T23:08:37.850 回答