我正在阅读教科书中的一个代码示例(哲学家餐饮问题),在main方法中,就在return 0;语句之前,有一段我已经包含在下面的代码块。这个循环被认为是将哲学家创建为一个并发的派生进程。这意味着每个哲学家都执行哲学家(I)。
但是,由于if语句之后紧跟着一个break,这是否意味着只创建了第一个哲学家(i = 0)?
for (i = 0; i < N - 1; ++i)
if (fork() == 0)
break;
philosopher(i) ;
我对最新的基于pthread的线程和Ubuntu开发环境中的互斥锁和消息传递的性能很感兴趣。一个很好的通用问题是进餐的哲学家,每个哲学家都使用与左右手邻居共享的lh和rh叉子。我将哲学家的数量增加到99,以使我的四核处理器保持忙碌。
int result = try_lock(forks[lhf], forks[rhf]);
上面的代码允许我的哲学家尝试抓取他们需要用餐的两个叉子。
// if the forks are locked then start eating
if (result == -1)
{
state[j] = philoso
我一直在维基百科上寻找餐饮哲学家问题的解决方案。
我知道它是如何工作的,以及打破循环结构是如何防止死锁的,但是解决方案如何防止饥饿呢?难道一个或几个线程不能在少数线程无法取得进展时继续运行吗?
如果不是,是什么阻止了这种情况的发生?
实现:
public class DinningphilMain {
public static void main(String[] args) throws InterruptedException {
int numPhil = 3;
Philosopher[] phil = new Philosopher
这是我的密码:
Table.java
public class Table {
Lock mutex;
int nbrOfChopsticks;
private boolean chopstick[]; //true if chopstick[i] is available
public Table(int nbrOfSticks){
nbrOfChopsticks=nbrOfSticks;
chopstick=new boolean[nbrOfChopsticks];
for(int i=0;i<nbr
我正在试图解决餐饮哲学家问题 in CSharp。我没有用信号灯,看上去很管用。我想知道1)我的代码死锁是否安全,2)我是否可以得到一些关于我的方法的反馈,而不是使用信号量。谢谢
using System;
using System.Linq;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
public enum State
{
Eating, Thinking,
}
internal class Program
{
private static
我正在尝试使用信号量来解决哲学家就餐问题。哲学家先拿起左边的叉子,然后再拿起右边的叉子,吃完后把它们放下。我使用5个线程来实现这一点,一个线程对应一个哲学家,5个信号量对应一个筷子。需要由父进程执行死锁检查,如果发现死锁,则打破死锁。当我刚刚运行哲学家思考和EATINGthe的循环时,程序崩溃并返回错误The futex facility returned an unexpected error code.Aborted。我没有得到任何关于如何调试这个错误的信息。
《哲学家的线索》如下所示
void *Philospoher_behaviour(void *param){
int id =
我解决这个难题的逻辑就是让左右筷子自由,这样哲学家才能抓取和吃东西。我不写条件来打破时间循环,因为我假设那些哲学家吃东西,思考24/7/。
我的解决方案死锁现在没有了吗?请随时给我建议。我对多线程很陌生。
import java.util.concurrent.Semaphore;
import java.util.concurrent.ThreadLocalRandom;
public class Main {
static int philosopher = 5;
static philosopher philosophers[] = new philosopher[p
我编写了这个程序来解决这个问题,通过仲裁解决算法,提到了这里,来解决这个问题。它指出,每个哲学家都应该请求Waiter的许可才能得到Fork。Philosopher吃东西要吃到两把叉子。我已经实现了逻辑,他要么握住两个叉子,要么放下,如果只有一个叉子。
我需要您对此代码进行审查,以了解有关编码实践、改进、可能的错误或替代解决方案的任何建议。
DiningAlgorithm
package com.study.fundamentals.util;
/**
* This is starting point for the dining algorithm
*/
我已经完成了解决方案。因为在某个时候,典型的监视器实现会导致饥饿。我已经看过了“礼貌”版的餐饮哲学家的问题,给了。
monitor diningPhilosophers {
int[] state = new int[5];
boolean[] leftHungry = new boolean[5];
boolean[] rightHungry = new boolean[5];
static final int THINKING = 0;
static final int HUNGRY = 1;
static final int EATING = 2;
如下图所示:
我正在尝试返回在同一schoolTypeClass中影响哲学家的所有哲学家。首先,我将展示工作正常的查询。问题查询在帖子的底部。
这是上面链接中的默认查询。我的目的是证明数据是存在的。也就是说,亚里士多德和柏拉图都分享了SchoolTypeClass‘运动’。
MATCH p1:Philosopher-[:MEMBER_OF]->s1:School-[:TYPE_OF]->st1:SchoolType-[:SUBCLASS_OF]->stc1:SchoolTypeClass
WHERE stc1.name = 'movement'
这是餐饮哲学家问题的又一次实现,这是家庭作业问题,我将在这里展示我迄今尝试过的:
/**
* DPServer.java
* <p>
* This class implements the methods called by the philosophers
*/
package cc;
import java.util.Random;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class DPServer {
我正在研究餐饮哲学家的问题,不能使用线程,所以我需要使用共享内存来使所有儿童进程都能看到筷子和哲学家的阵列。但是,我试图使用mmap,但是我对mmap的使用是不正确的,并且我不确定如何修复它,因为我的参数是一个int数组,而不是这个中的int。我应该使用不同的函数在共享内存中实现它吗?
(declared at the global scope)
int chopsticks[5];
int sizeOfSticks=sizeof(int)*5;
void* map = mmap(0,sizeOfSticks,PROT_READ|PROT_WRITE, MAP_SHARED,chopstick
我正在对锈蚀书中的问题做一些修改。
在这本书中,他们手工创造了所有的哲学家,最后一位让他的左手和右手切换。我以编程的方式(使用我将哲学家推上的for循环),现在我想修改最后一个哲学家。
,这就是我想做的,
// make the last philosopher left handed (switch forks)
let p = &philosophers[length - 1];
philosophers[length - 1] = Philosopher{left: p.right, right: p.left, name: p.name.clone()};
// error:
所以基本上我正在解决著名的“哲学家就餐”问题,5个哲学家正在使用克隆生成。关键是我希望每个哲学家都有一个id (从0到4)。我计划使用克隆传递参数来实现。下面是代码(我省略了一些子函数)
void philoshopher(void* arg)
{
int i = &arg;
while (TRUE)
{
printf("Philosopher %d is thinking", i);
take_forks(i);
printf("Philosopher %d is eating"
我必须通过使用信号量来解决哲学家就餐的问题。在我的代码中,每两个哲学家都在拿着一根筷子,其余的都在等待。
我在main函数中仍然有一些错误。你能告诉我怎么启动Chopstickk吗?我是的初学者。
binarysem ChopStick[5];
binarysem speak;
void philosopher(int index){
int i,k;
int x;
x=0;
for(i=0;i<k;i++){
cout << "I am philosopher: " << index << " and i am th