C ++中线程所做的更改

时间:2015-05-13 09:50:57

标签: c++ multithreading dining-philosopher

我试图模拟餐饮哲学家的问题,但我在查看它时遇到了麻烦。当线程从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;
        }
    }

2 个答案:

答案 0 :(得分:1)

如果没有同步,尝试从多个线程访问一个变量是Undefined Behavior。添加互斥锁。

答案 1 :(得分:1)

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

  

对此有何帮助?

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

Dining Philosophers Rebooted

简单的答案是创建一个.数组,它代表每个哲学家之间的分支并使用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); 实现中的一个复制出来(无论哪个最适合您)并使用它。