当前位置: 首页 > 知识库问答 >
问题:

C中线程所做的更改

萧丁雨
2023-03-14

我试图模拟餐饮哲学家的问题,但我很难想象它。当线程从等待()到吃()再到思考()时,它会改变一个名为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个答案

司徒兴思
2023-03-14

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

有什么帮助吗?

这个问题已经问了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实现中的一个(无论哪一个最适合您),然后使用它。

闾丘博
2023-03-14

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

 类似资料:
  • controller.java 问题是组合框在某些项的状态更新后看不到应用的更改。问题的原因是我只更改对象(即项)字段,而不通过方法设置新项。因此,场的变化似乎是不可观察的。我还知道,如果将类中的替换为两个(用于名称和状态字段),它就可以工作了。但我不想做字段复制。如果在类中有100个字段呢? 我有两个问题: 1)如何使ComboBox在类的任何字段中看到其他外部的更改而不重复字段(而不创建额外的

  • 本文向大家介绍C#做线形图的方法,包括了C#做线形图的方法的使用技巧和注意事项,需要的朋友参考一下 线形图是图表分析的一种形式,通过线形图可以比较直观的分析出数据的变化趋势,那么如何绘制线形图呢?接下来就给大家介绍一种绘制线形图的方法——如何使用excel绘制线形图。 1、首先在电脑上打开excel软件并创建一个空白表格,使用Microsoft office excel或WPS excel均可,在

  • 有关问题: 关于C 11: C 11: std::线程池? C 11中的异步(启动::a同步)会使线程池过时,以避免昂贵的线程创建吗? 关于升压: C提升线程重用线程 提升::线程并创建一个线程池! 我如何获得发送任务的线程池,而不必一次又一次地创建和删除它们?这意味着持久性线程可以在不加入的情况下重新同步。 我有如下代码: 与每次迭代都创建和加入线程不同,我更愿意在每次迭代中将任务发送给我的工作

  • 如果我在a[n]中有一个数组

  • 我已经改变了文件夹中存在node_modules一些文件。但是当我使用构建应用程序时,当我将其部署到服务器时,我看到了我在node_modules所做的更改。如何克服这一点? 我试过以下三种方法 > 我已经将分叉到GIT中,然后我使用了在我的项目中。我已将导入{BsDaterangepickerDirective}从'ngx bootstrap/datepicker'更改为我现在面临以下异常 ./

  • 当我创建一个简单的非多线程JavaFX应用程序并启动它时,该应用程序会创建一些线程(JavaFXApplicationThread、JavaFXLauncher等)。这些线程中的大多数都已命名,但在我的所有JavaFX应用程序中都有一个未命名的线程(“线程-1”或“线程-2”)。我绝对不会创建自己的线程,因为我尝试启动Hello World JavaFX应用程序(由IDEA生成),其中也包含“线程