我正在努力解决这个问题。
就我而言,每个哲学家都应该吃100万次。问题是好像只有“1”,是“3”吃完了。我使用的线程与关键部分锁定,这是我的代码:
CRITICAL_SECTION ghCARITICALSection1;
CRITICAL_SECTION ghCARITICALSection2;
CRITICAL_SECTION ghCARITICALSection3;
CRITICAL_SECTION ghCARITICALSection4;
CRITICAL_SECTION ghCARITICALSection5;
DWORD WINAPI func(int* phiphilosopher)
{
if (1 == *phiphilosopher && TryEnterCriticalSection(&ghCARITICALSection1) && TryEnterCriticalSection(&ghCARITICALSection2))
{
std::cout << "1 is eating...\n";
for (int i = 0; i < 1000000; i++)
{
i = i;
}
LeaveCriticalSection(&ghCARITICALSection1);
LeaveCriticalSection(&ghCARITICALSection2);
}
if (2 == *phiphilosopher && TryEnterCriticalSection(&ghCARITICALSection2) && TryEnterCriticalSection(&ghCARITICALSection3))
{
std::cout << "2 is eating...\n";
for (int i = 0; i < 1000000; i++)
{
}
LeaveCriticalSection(&ghCARITICALSection2);
LeaveCriticalSection(&ghCARITICALSection3);
}
if (3 == *phiphilosopher && TryEnterCriticalSection(&ghCARITICALSection3) && TryEnterCriticalSection(&ghCARITICALSection4))
{
std::cout << "3 is eating...\n";
for (int i = 0; i < 1000000; i++)
{
}
LeaveCriticalSection(&ghCARITICALSection3);
LeaveCriticalSection(&ghCARITICALSection4);
}
//...also for 4,5
return 0;
}
int philosopher1 = 1;
int* philosopher1ptr = &philosopher1;
int philosopher2 = 2;
int* philosopher2ptr = &philosopher2;
//...Also for philosopher 3,4,5
InitializeCriticalSection(&ghCARITICALSection1);
InitializeCriticalSection(&ghCARITICALSection2);
//...aslo for ghCARITICALSection 3,4,5
HANDLE WINAPI th1 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)func, philosopher1ptr, 0, NULL);
HANDLE WINAPI th2 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)func, philosopher2ptr, 0, NULL);
////...aslo for th3,4,5
WaitForSingleObject(th1, INFINITE);
WaitForSingleObject(th2, INFINITE);
//...also for th3,4,5
想想这里的逻辑
if (TryEnterCriticalSection(&a) && TryEnterCriticalSection(&b)) {
// . . .
LeaveCriticalSection(&a);
LeaveCriticalSection(&b);
}
如果TryEnterprise CriticalSect(
它应该看起来像
if (TryEnterCriticalSection(&a)) {
if (TryEnterCriticalSection(&b)) {
// . . .
LeaveCriticalSection(&b);
}
LeaveCriticalSection(&a);
}
本文向大家介绍餐饮哲学家问题(DPP),包括了餐饮哲学家问题(DPP)的使用技巧和注意事项,需要的朋友参考一下 餐饮哲学家的问题指出,有5位哲学家共享一张圆桌,他们交替吃饭和思考。每个哲学家都有一碗饭和5根筷子。哲学家需要左右筷子才能吃饭。饿了的哲学家只有在两把筷子都齐备的情况下才可以吃东西,否则哲学家放下筷子,重新开始思考。 餐饮哲学家是一个经典的同步问题,因为它演示了一大类并发控制问题。 餐饮
今天,我决定尝试解决哲学家吃饭的问题。所以我写下面的代码。但我认为这是不正确的,所以如果有人告诉我这是怎么回事,我会很高兴的。我使用fork作为锁(我只读取它们,因为我不把对它们的访问放在同步块中),我有一个扩展线程的类,它保留了它的两个锁。 我认为有些不对劲,因为第五位哲学家从不吃饭,第四位和第三位哲学家大多吃饭。提前感谢。
我的Java代码中有一个问题,它应该模拟pholosophers问题,如下所述:http://en.wikipedia.org/wiki/Dining_philosophers_problem我想输出所有哲学家的当前状态,每次他们中的一个吃饭或思考。输出应该是这样的:“OxOx(2)”,其中“X”表示哲学家在吃,“O”表示他在思考,“O”表示他在等筷子。括号中的数字表示状态已更改的哲学家的编号。我
我必须用信号量来解决这个问题。在我的代码中,每一个哲学家都在拿一根筷子,其他人都在等待。 我在主函数中仍然有一些错误。你能告诉我怎么使用筷子吗?我是BACI的初学者。
我想用java信号量解决用餐哲学家的问题,但我被卡住了。最高ID的筷子应该是可用的,但它似乎总是采取,我不知道为什么。谁能告诉我我错在哪里了? Fork类: 哲学家班: 主要内容:
根据这篇维基百科文章中的钱迪/米斯拉部分,我们有5位哲学家,编号为P1-P5。 根据这句话: 对于每一对争夺资源的哲学家,创建一个叉子,并将其交给具有较低ID的哲学家(n代表代理Pn)。每个叉子可以是脏的或干净的。最初所有的叉子都是脏的 当一个有叉子的哲学家收到一个请求消息时,如果叉子是干净的,他会保留它,但是如果叉子是脏的,他会放弃它。如果他把叉子送过去,他会先把叉子清理干净。 因此,如果知道所