【问题标题】:Changes made by threads in C++C++ 中线程所做的更改
【发布时间】:2015-07-24 12:46:01
【问题描述】:

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

【问题讨论】:

  • 可能是因为您观察的变量与您正在修改的变量不同。
  • SSCCE 请。
  • 我不确定您使用的是什么多线程标准(C++11?POSIX pthreads?),但它们中的大多数禁止在一个线程中访问一个对象,而它正在或可能是,在另一个线程中修改。据推测,您使用的标准提供了同步访问共享状态的工具——互斥锁、原子,等等——使用它们。

标签: c++ multithreading dining-philosopher


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    有什么帮助吗?

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

    Dining Philosophers Rebooted

    简单的答案是创建一个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 实现之一(无论哪个最适合您)并使用它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-01
      • 2017-01-01
      • 1970-01-01
      相关资源
      最近更新 更多