我试图模拟餐饮哲学家的问题,但我很难想象它。当线程从等待()到吃()再到思考()时,它会改变一个名为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;
}
}
因为这是我能找到的唯一问题:
有什么帮助吗?
这个问题已经问了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
实现中的一个(无论哪一个最适合您),然后使用它。
如果没有同步,则尝试从多个线程访问一个变量是未定义行为。添加互斥锁。
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生成),其中也包含“线程