首页
学习
活动
专区
圈层
工具
发布

linux哲学家就餐问题

一、基础概念

  1. 哲学家就餐问题描述
    • 这是一个经典的并发控制问题。有五个哲学家围坐在一张圆形餐桌旁,每个哲学家之间有一根筷子(资源)。哲学家们的生活由一系列的动作组成:思考、饥饿、拿起筷子、吃饭、放下筷子。当一个哲学家饥饿时,他会尝试拿起左右两边相邻的筷子,只有当两根筷子都拿到手时,他才能吃饭,吃完饭后放下筷子继续思考。
  • 涉及的并发概念
    • 这个问题主要涉及到进程或线程之间的同步和互斥。多个哲学家(可以看作多个并发执行的进程或线程)需要竞争有限的资源(筷子),并且要避免出现死锁、饥饿等并发问题。

二、相关优势(如果从正确解决该问题的角度来看)

  1. 资源合理利用
    • 正确的解决方案可以确保筷子(资源)得到合理的分配和使用,使得哲学家们能够有序地进行思考和就餐活动,不会出现资源长时间闲置或者过度竞争的情况。
  • 避免系统故障
    • 防止死锁的发生,死锁会导致整个系统中的哲学家都无法继续进行下一步动作,就像程序中的死锁会使相关进程无法继续执行一样。

三、类型(从不同的解决思路角度)

  1. 资源分级法
    • 给筷子编号,哲学家总是先拿起编号较小的筷子,再拿起编号较大的筷子。这样可以避免循环等待的情况,从而避免死锁。例如,对于哲学家i(0 <= i < 5),他先拿起i号筷子,再拿起(i + 1)%5号筷子。
  • 信号量机制
    • 可以使用信号量来表示筷子的可用状态。每个筷子对应一个信号量,初始值为1(表示筷子可用)。哲学家在拿起筷子之前需要执行P操作(等待操作,如果信号量为0则阻塞),放下筷子时执行V操作(释放操作,使信号量加1)。
    • 以下是使用信号量解决哲学家就餐问题的简单伪代码示例(基于Linux的信号量机制概念):
代码语言:txt
复制
#include <semaphore.h>
#include <pthread.h>

#define NUM_PHILOSOPHERS 5

sem_t chopsticks[NUM_PHILOSOPHERS];

void* philosopher(void* num) {
    int i = *(int*)num;
    while (1) {
        // 思考
        printf("Philosopher %d is thinking
", i);
        // 饥饿并尝试拿起筷子
        sem_wait(&chopsticks[i]);
        sem_wait(&chopsticks[(i + 1)%NUM_PHILOSOPHERS]);
        // 吃饭
        printf("Philosopher %d is eating
", i);
        // 放下筷子
        sem_post(&chopsticks[i]);
        sem_post(&chopsticks[(i + 1)%NUM_PHILOSOPHERS]);
    }
}

int main() {
    pthread_t philosophers[NUM_PHILOSOPHERS];
    int philosopher_nums[NUM_PHILOSOPHERS];
    for (int i = 0; i < NUM_PHILOSOPHERS; i++) {
        sem_init(&chopsticks[i], 0, 1);
    }
    for (int i = 0; i < NUM_PHILOSOPHERS; i++) {
        philosopher_nums[i] = i;
        pthread_create(&philosophers[i], NULL, philosopher, &philosopher_nums[i]);
    }
    for (int i = 0; i < NUM_PHILOSOPHERS; i++) {
        pthread_join(philosophers[i], NULL);
    }
    for (int i = 0; i < NUM_PHILOSOPHERS; i++) {
        sem_destroy(&chopsticks[i]);
    }
    return 0;
}

四、应用场景

  1. 操作系统资源管理
    • 类似于操作系统中的进程对硬件资源(如内存、I/O设备等)的竞争管理。多个进程可能需要同时访问某些共享资源,就像哲学家需要筷子一样,需要合理的调度策略来避免冲突。
  • 分布式系统中的资源分配
    • 在分布式系统中,不同的节点可能需要访问共享的资源(如数据库连接、网络带宽等),可以借鉴哲学家就餐问题的解决思路来确保资源的有效分配和避免死锁等问题。

五、可能遇到的问题及原因

  1. 死锁问题
    • 原因:如果每个哲学家都先拿起左边的筷子,然后再拿右边的筷子,可能会出现所有哲学家都拿着左边的筷子等待右边筷子的情况,形成循环等待,导致死锁。
    • 解决方法:如前面提到的资源分级法或者采用信号量机制并合理设计获取和释放资源的顺序。
  • 饥饿问题
    • 原因:某些哲学家可能由于资源分配策略不合理,总是无法获取到两根筷子,从而长时间处于饥饿状态。
    • 解决方法:可以采用公平的资源分配策略,例如在信号量机制中采用先来先服务的排队方式,确保每个哲学家都有机会获取到资源进行就餐。
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

6.哲学家就餐问题 原

哲学家就餐问题 有五个哲学家,他们的生活方式是交替的进行思考和进餐。哲学家们公用一张圆桌,分别坐在周围的五张椅子上。在圆桌上有5个碗和5支筷子。...var chopstick:array[0……4] of semaphor 所有信号量被初始化为1 用记录型信号量解决哲学家进餐问题 第i个哲学家的活动可买描述为 repeat wait(chopstick...think; until false; 问题 假如5个哲学家同时饥饿而各自拿起左边的筷子,会使5个信号量均为0;当他们再试图拿起右边筷子时,都将无限期的等待。...仅当哲学家的左右两支筷子均可使用时,才允许他拿起筷子进餐。 规定奇数号哲学家先拿起其左边的筷子,再拿左边的,偶数号哲学家则相反。...用AND型信号量解决哲学家进餐问题 var chopstick: array[0...4] of semaphore := (1,1,1,1,1) 具体过程: repeat think; Swait

1.2K10

多线程互斥锁解决哲学家就餐问题

哲学家就餐问题是一个了解和练习线程间同步的非常好的小例子,题为 5 个哲学家(线程)围成一桌就餐,但是只有 5 只筷子(锁),一个人想要吃饭就必须要拥有左侧的筷子(锁1)和右侧的筷子(锁2)才能吃饭。...每一个哲学家刚进桌前都持有了自己左侧的筷子,这样所有人只有一只筷子都无法就餐,所以就要想办法去拿右侧的筷子,而因为右侧的筷子被别人持有,所以无法拿到,这个时间就成了死锁状态。...所以必须要有一个解锁的条件,那就是在哲学家尝试去拿右侧筷子的时候,如果失败了,那么将自己左手边的筷子放下,此时这个哲学家左侧人就可以持有他原来左手边的筷子来就餐了。...arg[i].left = mutex[i];//锁1,对应哲学家左侧筷子 arg[i].right = mutex[(i + 1) % THREAD_COUNT];//锁2,对应哲学家右侧筷子 pthread_create...for (i = 0; i < THREAD_COUNT; i++) { pthread_mutex_destroy(&mutex[i]); } return 0; } 程序运行后结果如下图,每个哲学家都可以正常的就餐了

37410
  • 《Java-SE-第三十章》之哲学家就餐问题

    } } }); t2.start(); } } 通过使用jconsole观察两个线程的状态 通过观察可知都死锁了 哲学家就餐问题...  哲学家就餐问题由Edsger Dijkstra提出的,该问题是一个经典的死锁问题,该问题的基本描述中是指定五个哲学家。...这些哲学家将花部分时间思考,花部分时间就餐。当他们思考的时候,不需要任何共享资源;但当他们就餐时,将使用有限数量的餐具。在问题的原始描述中,餐具是叉子。...当一个哲学家要就餐的时候,这个哲学家必须同时得到左边和右边的筷子。上述问题会产生死锁的情况,当5个哲学家都拿起自己左或者右手手边的筷子,准备拿右手或者左手边的筷子时产生死锁现象。...} } TimeUnit.SECONDS.sleep(5); exec.shutdownNow(); } } 运行结果: 由此就解决了哲学家就餐问题中的死锁

    21330

    linux网络编程之System V 信号量(二):用信号量实现进程互斥示例和解决哲学家就餐问题

    short  *array;  /* Array for GETALL, SETALL */     struct seminfo  *__buf;  /* Buffer for IPC_INFO (Linux-specific...输出如下: simba@ubuntu:~/Documents/code/linux_programming/UNP/system_v$ ....二、哲学家就餐问题的描述可以参考这里,下面我们尝试解决这个问题的方法是:仅当一个哲学家两边筷子都可用时才允许他拿筷子。...上图中红色数字表示哲学家的编号,总共5个哲学家,用5个进程来表示;黑色数字表示筷子的编号,总共有5根筷子,可以定义一个信号量集中含有5个信号量,每个信号量的初始值为1,当某个哲学家可以同时得到两根筷子(...如果发现程序没有运行卡着,即没有发生死锁现象,从中也可以发现同时最多只能有两个哲学家一起用餐,也不会出现相邻哲学家一起用餐的情况。 参考: 《UNP》

    1.4K00

    ucore-lab7

    练习0 填写实验,自行填写,懒得找了,可以参考kiprey 练习一 理解内核级信号量的实现和基于内核级信号量的哲学家就餐问题(不需要编码) 完成练习0后,建议大家比较一下(可用meld等文件diff...实际上就是解释ucore的哲学家就餐怎么实现的,内核级别的信号量怎么实现的,之后给出自己关于用户级别的信号量的设计方案,比较两者异同。 关于哲学家就餐问题,不知道为什么,代码里面有注释,中文的。。。...练习二 练习二2: 完成内核级条件变量和基于内核级条件变量的哲学家就餐问题(需要编码) 首先掌握管程机制,然后基于信号量实现完成条件变量实现,然后用管程机制实现哲学家就餐问题的解决方案(基于条件变量)...cvp %x, cvp->count %d, cvp->owner->next_count %d\n", cvp, cvp->count, cvp->owner->next_count); } 哲学家就餐问题基本和信号量的实现相同...最终效果如下,由于没有实现相应的哲学家就餐问题,make grade只有183,不过这不重要: 由于只是简化实现,因此并没有对写者加锁的代码。

    99830

    哲学家进餐问题的模拟【操作系统】

    哲学家就餐问题是描述死锁的经典例子。为了防止死锁,可以采用资源预分配法或者资源按序分配法。...二、设计内容 哲学家进餐问题的模拟。 三、开发环境 windows环境,Myeclipse平台。...当哲学家饥饿时总是先拿其左边的筷子,成功后,再去拿右边的筷子,又成功后方可就餐。进餐完,又先放下他左边的筷子,再放下右边筷子。这个算法可以保证不会有两个相邻的哲学家同时就餐,但有可能引起死锁。...才允许哲学家拿起筷子就餐 (3)规定奇数号哲学家先拿起右边筷子,然后再去拿左边筷子,而偶数号哲学家则相反。...实习中还有对LINUX操作系统内核代码的分析,使我们具体的认识了LINUX,了解其设计思想和功能模块,而在LINUX下的各种常用命令也要求我们熟练掌握。

    63030

    ucoreOS_lab7 实验报告

    (不需要编码) 在完成本练习之前,先说明下什么是哲学家就餐问题: 哲学家就餐问题,即有五个哲学家,他们的生活方式是交替地进行思考和进餐。...count > 0,表示共享资源的空闲数 count < 0,表示该信号量的等待队列里的进程数 count = 0,表示等待队列为空 实验 7 的主要任务是实现基于信号量和管程去解决哲学家就餐问题,我们知道...\n"); return 0; } 该函数与实验四基本没有不同之处,唯一的不同在于它调用了 check_sync() 这个函数去执行了哲学家就餐问题。...、0表示共享内存 //创建哲学家就餐问题的内核线程 if (pid <= 0) { //创建失败的报错 panic("create No....(需要编码) 首先掌握管程机制,然后基于信号量实现完成条件变量实现,然后用管程机制实现哲学家就餐问题的解决方案(基于条件变量)。

    1.6K20

    linux网络编程之进程间通信基础(二):死锁、信号量与PV原语简介

    (6)哲学家就餐问题 五个哲学家围在一个圆桌就餐,每个人都必须拿起两根筷子才能用餐,当每个人都先拿起左筷子,等待右筷子的时候就会造成死锁。 ?...哲学家就餐问题解法 服务生解法 最多4个哲学家 仅当一个哲学家两边筷子都可用时才允许他拿筷子 给所有哲学家编号,奇数号的哲学家必须首先拿左边的筷子,偶数号的哲学家则反之 二、信号量与PV原语...(s.value < =0) { 唤醒相应等待队列s.queue中等待的一个进程 改变其状态为就绪态 并将其插入就绪队列 } } (4)用PV原语解决司机与售票员问题...(5)用PV原语解决民航售票问题 ?...每个客户端都在执行PV这样的操作流程 (6)用PV原语解决汽车租赁问题 有一汽车租赁公司有两部敞篷车可以出租,假定同时来了四个顾客都要租敞篷车,那么肯定会有两个人租不到。 ?

    1.6K00

    漫谈并发和并行:死磕哲学家进餐问题

    我们这里就死磕一下其中的死锁问题。 哲学家进餐问题 哲学家进餐问题是描述死锁最经典的问题,我们后续整个文章都会以此为出发点来讨论,现在先列出来哲学家进餐的问题描述。...问题场景是五个哲学家围绕一个圆桌就做,桌上摆着五只(不是五双)筷子。哲学家的状态可能是“思考”或者“饥饿”。如果饥饿,哲学家就将拿起他两边的筷子并就餐一段时间。就餐结束,哲学家就会放回筷子。...文章组织 本文主要是讲哲学家进餐问题,因此有必要先回顾一些锁的知识,然后会通过四个版本的程序来解决哲学家进餐问题,最后一个简单的总结。 在这里先说明四个版本的程序有什么区别: 经典的内置锁解决方案。...Philosopher Thread[Thread-1,5,main] has thought 24410 times 0x04 版本3:ReentrantLock+超时取消 前面我们实现了两个版本的哲学家进餐问题...改进 根据前面原子变量的说明,我们有了哲学家进餐问题的新解法!!! 我们对代码进行了一些调整。取掉了Chopstick类,并对Philosopher做了较大的改动。

    1.8K40

    java中的哲学家用餐问题-Java快速进阶教程

    简介 哲学家用餐问题是用于描述多线程环境中的同步问题并说明解决这些问题的技术的经典问题之一。Dijkstra首先提出了这个问题,并提出了关于访问磁带驱动器外围设备的计算机的问题。...在本文中,我们分析了这个众所周知的问题并编写了一个流行的解决方案。 2. 问题 上图表示了问题。有五个沉默的哲学家(P1 – P5)围坐在一张圆桌旁,一生都在吃饭和思考。...现在,让我们实现哲学家的核心逻辑。 为了模拟获取分叉,我们需要锁定它,这样就不会有两个哲学家线程同时获取它。...解决方案的问题:死锁 尽管上述解决方案似乎是正确的,但出现了死锁的问题。 死锁是指系统进度停止的情况,因为每个进程都在等待获取由其他进程持有的资源。...结论 在本文中,我们探讨了著名的哲学家用餐问题以及循环等待和死锁的概念。我们编写了一个简单的解决方案,导致死锁,并进行了简单的更改以打破循环等待并避免死锁。这只是一个开始,更复杂的解决方案确实存在。

    9700

    「JAVA」线程生命周期分阶段详解,哲学家们也深感死锁难解

    每个线程在创建时都有默认优先级,主线程默认优先级为5,如果A线程创建了B线程,那么B线程和A线程具有相同优先级;虽然Java 中可设置的优先级有10个,但不同的操作系统支持的线程优先级不同的,windows支持的,linux...哲学家就餐问题 哲学家就餐的问题也是一个描述死锁很好的例子,以下是问题描述(内容来源于百度百科): 假设有五位哲学家围坐在一张圆形餐桌旁,做以下两件事情之一:吃饭,或者思考。...这个策略消除了死锁(系统总会进入到下一个状态),但又会产生新的问题:如果五位哲学家在完全相同的时刻进入餐厅,并同时拿起左边或者右边的餐叉,那么这些哲学家就会同时等待五分钟,同时放下手中的餐叉,又再等五分钟...哲学家就餐问题 在实际的计算机问题中,缺乏餐叉可以类比为缺乏共享资源。...所以在Java 多线程开发中,尽量避免死锁问题,因为发生这样的问题真的很头疼。尽量多熟悉,多实践多线程中的理论和操作,从一次次的成功案例中体会Java 多线程设计的魅力。

    94340

    操作系统笔记【进程互斥同步及通信死锁问题】

    (一) 进程间的互斥关系 (1) 电影院多线程问题引入 由于我们今天的问题是基于并发的,所以我简单的通过一个 Java 多线程的例子来引入今天的内容(今天主要讲的是进程,这里的多线程问题,体会一下出现的问题就好了...(2) 读写问题 问题描述:对共享资源的读写操作,任一时刻“写者”最多只允许一个,而“读者”则允许 多个,要求: “读-写” 互斥 “写-写” 互斥 “读-读” 允许 (3) 哲学家就餐问题 就餐条件:...哲学家想吃饭,先提出吃饭要求 提出吃饭要求后,并拿到两双筷子后,方可吃饭。...如果筷子被他人获得,则必须等待此人吃完后,才能获取筷子 对于已经申请吃饭的任意一个哲学家在自己未拿到两只筷子吃饭之前,不放下自己的筷子 刚开始就餐时,只允许两个哲学家请求吃饭 要考虑的问题是如何保证哲学家们的动作有序进行...(3)在什么情况下,5个哲学家全部吃不上饭?

    72710

    多个线程为了同个资源打起架来了,操作系统是如何让他们安分的?

    ---- 经典同步问题 哲学家就餐问题 当初我在校招的时候,面试官也问过「哲学家就餐」这道题目,我当时听的一脸懵逼,无论面试官怎么讲述这个问题,我也始终没听懂,就莫名其妙的说这个问题会「死锁」。...哲学家就餐的问题 先来看看哲学家就餐的问题描述: 5 个老大哥哲学家,闲着没事做,围绕着一张圆桌吃面; 巧就巧在,这个桌子只有 5 支叉子,每两个哲学家之间放一支叉子; 哲学家围在一起先思考,思考中途饿了就会想进餐...方案一的问题 不过,这种解法存在一个极端的问题:假设五位哲学家同时拿起左边的叉子,桌面上就没有叉子了, 这样就没有人能够拿到他们右边的叉子,也就说每一位哲学家都会在 P(fork[(i + 1) % N...方案三 那既然方案二使用互斥信号量,会导致只能允许一个哲学家就餐,那么我们就不用它。...方案四也可解决问题 方案四同样不会出现死锁,也可以两人同时进餐。 读者-写者问题 前面的「哲学家进餐问题」对于互斥访问有限的竞争问题(如 I/O 设备)一类的建模过程十分有用。

    1.3K30

    信号量机制

    a.生产者-消费者(缓冲区问题) 生产者一消费者问题(producer-consumerproblem)是指若干进程通过有限的共享缓冲区交换数据时的缓冲区资源使用问题。...b.作者读者问题 读者一写者问题(readers-writersproblem)是指多个进程对一个共享资源进行读写操作的问题。...c.哲学家进餐问题 (1) 在什么情况下5 个哲学家全部吃不上饭? 考虑两种实现的方式,如下: A....以下将room 作为信号量,只允 许4 个哲学家同时进入餐厅就餐,这样就能保证至少有一个哲学家可以就餐,而申请进入 餐厅的哲学家进入room 的等待队列,根据FIFO 的原则,总会进入到餐厅就餐,因此不会...在多道程序环境下,进程同步是一个十分重要又令人感兴趣的问题,而生产者-消费者问题是其中一个有代表性的进程同步问题。

    26710

    多个线程为了同个资源打起架来了,该如何让他们安分?

    ---- 经典同步问题 哲学家就餐问题 当初我在校招的时候,面试官也问过「哲学家就餐」这道题目,我当时听的一脸懵逼,无论面试官怎么讲述这个问题,我也始终没听懂,就莫名其妙的说这个问题会「死锁」。...哲学家就餐的问题 先来看看哲学家就餐的问题描述: 5 个老大哥哲学家,闲着没事做,围绕着一张圆桌吃面; 巧就巧在,这个桌子只有 5 支叉子,每两个哲学家之间放一支叉子; 哲学家围在一起先思考,思考中途饿了就会想进餐...方案一的问题 不过,这种解法存在一个极端的问题:假设五位哲学家同时拿起左边的叉子,桌面上就没有叉子了, 这样就没有人能够拿到他们右边的叉子,也就说每一位哲学家都会在 P(fork[(i + 1) % N...方案三 那既然方案二使用互斥信号量,会导致只能允许一个哲学家就餐,那么我们就不用它。...方案四也可解决问题 方案四同样不会出现死锁,也可以两人同时进餐。 读者-写者问题 前面的「哲学家进餐问题」对于互斥访问有限的竞争问题(如 I/O 设备)一类的建模过程十分有用。

    66130

    【JavaEE初阶】深入解析死锁的产生和避免以及内存不可见问题

    状态,并且在等锁B,那么锁B的拥有者是线程2;同理,线程2在等锁A,而锁A的拥有者就是线程1; 可以发现此时两个锁都在等对方释放锁,此时就产生了死锁; 3.N个线程,M把锁 此时这种情况就是要考虑到“哲学家就餐问题了...”,什么是哲学家就餐问题呢???...解释:此时有5个哲学家要吃面,但是筷子只有5根,这无根筷子在每个哲学家之间,此时就是五个哲学家就是五个线程,筷子就是锁,当每个哲学家拿到筷子后,旁边的两哲学家是吃不到的,就处于阻塞的状态,一般情况下哲学家啥时候吃到面是一个随机问题...,一般情况下这是没有问题的~~~ 注意:当我们每个哲学家左手拿起筷子时,可以发现此时每个哲学家都吃不到面(吃面要两根筷子),都等待另一个哲学家释放筷子(锁),此时就发生了线程的阻塞 ; 3.2解决死锁的方法...,那么5号哲学家先再拿起5号筷子,此时当5号哲学家吃完后,放下筷子,一次类推,可以保证每个哲学家都拿够吃到面~~~,同理这就解决了死锁这个问题; 那么此时我们就可以改变之前这个双方获取两个锁的这个代码,

    20210

    操作系统核心原理-4.线程原理(下):死锁基础原理

    二、应对死锁 2.1 引子:哲学家就餐问题   哲学家每天只做两件事:思考和吃饭。他们每天不停地思考人生的这里,比如人从什么地方来,人为什么是现在这个样子,人类往哪里去等深刻的问题。...显然,如果每个哲学家穿插着执行,将会出现每个哲学家都拿起左边筷子,而等待右边筷子的情况,即死锁将会发生。那么,有木有办法防止哲学家出现死锁呢?...2.4 解决:哲学家就餐问题   这里使用C#语言,模拟信号量,以消除死锁的必要条件(消除保持并等待的必要条件)的方式来实现解决哲学家就餐问题。   ...如果一个哲学家需要阻塞,则阻塞发生在该信号量上。...", philosopher + 1); }   (4)哲学家的日常生活:思考,拿筷子,吃饭,放下筷子,继续思考...... /// /// 哲学家程序

    73620

    「JAVA」线程生命周期分阶段详解,哲学家们深感死锁难解

    每个线程在创建时都有默认优先级,主线程默认优先级为5,如果A线程创建了B线程,那么B线程和A线程具有相同优先级;虽然Java 中可设置的优先级有10个,但不同的操作系统支持的线程优先级不同的,windows支持的,linux...哲学家就餐问题 哲学家就餐的问题也是一个描述死锁很好的例子,以下是问题描述(内容来源于百度百科): 假设有五位哲学家围坐在一张圆形餐桌旁,做以下两件事情之一:吃饭,或者思考。...这个策略消除了死锁(系统总会进入到下一个状态),但又会产生新的问题:如果五位哲学家在完全相同的时刻进入餐厅,并同时拿起左边或者右边的餐叉,那么这些哲学家就会同时等待五分钟,同时放下手中的餐叉,又再等五分钟...,哲学家任然会饿死。...所以在Java 多线程开发中,尽量避免死锁问题,因为发生这样的问题真的很头疼。尽量多熟悉,多实践多线程中的理论和操作,从一次次的成功案例中体会Java 多线程设计的魅力。 完结。

    60900

    python自学成才之路 死锁的解决方案

    ,”哲学家就餐问题“,题目是这样的:五位哲学家围坐在一张桌子前,每个人 面前有一碗饭和一只筷子。...在这里每个哲学家可以看做是一个独立的线程,而每只筷子可以看做是一个锁。每个哲学家可以处在静坐、 思考、吃饭三种状态中的一个。...需要注意的是,每个哲学家吃饭是需要两只筷子的,这样问题就来了:如果每个哲学家都拿起自己左边的筷子, 那么他们五个都只能拿着一只筷子坐在那儿,直到饿死。此时他们就进入了死锁状态。...不要等问题发生了再去解决,而是在源头上避免发生问题。出现死锁的充要条件是形成一个环,所以如果在并发开发的时候,不要让环形成,死锁产生的条件满足不了,是不是就避免了死锁。...再回到文章开头的哲学家问题,怎么让这些哲学家能吃上饭呢?每个哲学家需要两只筷子才能吃上饭,我们让哲学家按照我们提供的规则去申请筷子。

    83410
    领券