我试图解决哲学家进餐的问题,每次打印出来只有两个人在吃饭。我创建的每个线程都是一个哲学家,每个部分都是一个叉子,根据算法,每次我们派一个哲学家,我们都试图得到他的叉子(第一次是叉子1和叉子2),叉子是关键部分。你知道怎么解决这个问题吗?这是我的密码:
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#include <tchar.h>
#include <iostream>
#include <chrono>//To check runtime(it was also asked but I know how to do this)
#include <thread>
using namespace std;
CRITICAL_SECTION ghCARITICALSection1;
CRITICAL_SECTION ghCARITICALSection2;
//Same for the rest
DWORD WINAPI func(int* phiphilosopher)
{
if (1 == *phiphilosopher)
{
if (TryEnterCriticalSection(&ghCARITICALSection1)) {
if (TryEnterCriticalSection(&ghCARITICALSection2)) {
cout << "1 is eating..."<< endl;
for (int i = 0; i < 1000000; i++)
{
i = i;
}
LeaveCriticalSection(&ghCARITICALSection2);
}
LeaveCriticalSection(&ghCARITICALSection1);
}
}
//Same for the rest but with all the numbers increased and on the 5th we check 5 and 1
这就是主要问题:
int main()
{
int philosopher1 = 1;
int* philosopher1ptr = &philosopher1;
//Same for the rest
InitializeCriticalSection(&ghCARITICALSection1);
InitializeCriticalSection(&ghCARITICALSection2);
//Same for the rest
HANDLE WINAPI th1 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)func, philosopher1ptr, 0, NULL);
//Same for the rest
WaitForSingleObject(th1, INFINITE);
//Same for the rest
}
可能两个或更多的线程访问相同的关键部分,并相互重叠。尝试在每个线程的创建之间添加计时器。
HANDLE WINAPI th1 = CreateThread(...);
std::this_thread::sleep_for(std::chrono::milliseconds(100));
HANDLE WINAPI th2 = CreateThread(...);
我试图按照Rust文档中的示例进行操作。链接中的最终代码: 运行此命令将生成以下输出: 根据文献记载,哲学家应该能够同时吃饭。预期结果如下所示: 不幸的是,无论代码执行的频率有多高,这种情况都不会发生。 我目前正在Windows上使用,但问题也发生在生锈的操场上。你自己试试吧。
本文向大家介绍餐饮哲学家问题(DPP),包括了餐饮哲学家问题(DPP)的使用技巧和注意事项,需要的朋友参考一下 餐饮哲学家的问题指出,有5位哲学家共享一张圆桌,他们交替吃饭和思考。每个哲学家都有一碗饭和5根筷子。哲学家需要左右筷子才能吃饭。饿了的哲学家只有在两把筷子都齐备的情况下才可以吃东西,否则哲学家放下筷子,重新开始思考。 餐饮哲学家是一个经典的同步问题,因为它演示了一大类并发控制问题。 餐饮
生产者/消费者和读者/作家很容易想到,但是餐饮哲学家呢?在什么样的情况下,N个进程和N个资源会躺在环形拓扑上并相互交错?我可以想到N个进程竞争M个资源,但是在这种情况下,每个进程可以使用任何两个资源。 维基说Dijkstra用它来模拟竞争磁带驱动器外围设备的计算机。这种情况在现代还存在吗?
我正在努力解决这个问题。 就我而言,每个哲学家都应该吃100万次。问题是好像只有“1”,是“3”吃完了。我使用的线程与关键部分锁定,这是我的代码: 每个哲学家都必须交替思考和进食。然而,一个哲学家只有在有左右叉子的情况下才能吃意大利面。每把叉子只能由一位哲学家持有,因此只有在另一位哲学家没有使用叉子的情况下,一位哲学家才能使用叉子
我正在寻找一种方法来解决用餐哲学家使用信号量的问题,我非常坚持我应该如何去做。我在下面包含了我的代码。 我在想,当一位哲学家用扫描电镜拿起筷子时。acquire()然后使用但我不确定这是否正确。它是? 编辑,这样我就实现了这个。这似乎有效,但我不确定。
今天,我决定尝试解决哲学家吃饭的问题。所以我写下面的代码。但我认为这是不正确的,所以如果有人告诉我这是怎么回事,我会很高兴的。我使用fork作为锁(我只读取它们,因为我不把对它们的访问放在同步块中),我有一个扩展线程的类,它保留了它的两个锁。 我认为有些不对劲,因为第五位哲学家从不吃饭,第四位和第三位哲学家大多吃饭。提前感谢。