信号量解决哲学家进餐问题

参考线程同步之信号量(sem_init,sem_post,sem_wait) - 郑志强Aloha - 博客园

以及《操作系统概念》第七版 第六章 项目:生产者-消费者问题

题目描述:

哲学家进餐问题描述有五个哲学家,他们的生活方式是交替地进行思考和进餐,n哲学家们共用一张圆桌,分别坐在周围的五张椅子上,在圆桌上有五个碗和五支筷子,n平时哲学家进行思考,饥饿时便试图取其左、右最靠近他的筷子,只有在他拿到两支筷子时才能进餐,n进餐完毕,放下筷子又继续思考。

如图。

编号都为0-4。哲学家0-3左边的筷子编号为i,右边为i+1。

哲学家4左边的筷子为4,右边为0。(因为是圆桌嘛)

代码:

这里ret应该用int。。忘了改了。

效果图:

遇到的问题:

解决:应该放到main函数里初始化

解决:太低级的错误了。。。。居然用了函数名做变量名。

原文地址:https://www.cnblogs.com/lqerio/p/11117672.html

时间: 2024-10-10 23:55:04

信号量解决哲学家进餐问题的相关文章

Operating System-进程/线程内部通信-信号量、PV操作的实现和应用(解决哲学家进餐和生产者消费者问题)

本文主要内容: 信号量的实现 利用信号量解决哲学家用餐问题 利用信号量解决生产者消费者问题 一.信号量的实现 1.1 信号量结构 typedef struct { int value; struct process * list } semaphore; value代表当前信号量可以使用的数量,list代表当前信号量上所等待的进程. 1.2 P操作实现 P(semaphore * s) { s.value--; if(s.value < 0) { add current process to s

经典进程的同步问题之——哲学家进餐

哲学家进餐问题描述 由Dijkstra提出并解决哲学家进餐问题(The Dinning Philosophers Problem)是经典的同步问题.该问题是描述有五个哲学家共用一张圆桌,分别坐在周围的五张椅子上,在桌子上有五个碗和五只筷子,他们的生活方式是交替的进行思考和进餐.平时,一个哲学家进行思考,饥饿时便试图取用其左右最靠近他的筷子,只有他拿到两只筷子时才能进餐,进餐完毕继续进行思考. 1 利用记录型信号量解决哲学家进餐问题 经过分析可知,圆桌上的筷子是临界资源,在一段时间内只允许一位哲学

哲学家进餐

问题描述 一张圆桌上坐着5名哲学家,每两个哲学家之间的桌上摆一根筷子,桌子的中间是一碗米饭,如图2-10所示.哲学家们倾注毕生精力用于思考和进餐,哲学家在思考时,并不影响他人.只有当哲学家饥饿的时候,才试图拿起左. 右两根筷子(一根一根地拿起).如果筷子已在他人手上,则需等待.饥饿的哲学家只有同时拿到了两根筷子才可以开始进餐,当进餐完毕后,放下筷子继续思考. 问题分析 1) 关系分析.5名哲学家与左右邻居对其中间筷子的访问是互斥关系. 2) 整理思路.显然这里有五个进程.本题的关键是如何让一个哲

【操作系统】经典的同步问题(生产者消费者问题, 哲学家进餐问题, 读写问题)

用专业术语来说, 进程是程序的一次动态执行.说简单点, 就是进程是系统中的某个任务.操作系统中有多个任务需要执行, 那么怎样执行才能使它们同步呢? 即如何让任务并发执行互不影响呢? 这就引出了进程同步中的经典问题: 生产者消费者问题, 哲学家进餐问题, 读写问题 生产者-消费者问题 有一群生产者进程在生产产品, 并将这些产品提供给消费者进程取消费. 为使生产者进程与消费者进程能并发进行, 在两者间设置了一个具有n个缓冲区的缓冲池, 生产者进程将其所生产的产品翻入缓冲区中, 消费者进程可从一个缓冲

用信号量解决进程的同步与互斥探讨【持续更新】

现代操作系统采用多道程序设计机制,多个进程可以并发执行,CPU在进程之间来回切换,共享某些资源,提高了资源的利用率,但这也使得处理并发执行的多个进程之间的冲突和相互制约关系成为了一道难题.如果对并发进程的调度不当,则可能会出现运行结果与切换时间有关的情况,令结果不可再现,影响系统的效率和正确性,严重时还会使系统直接崩溃.就比如你只有一台打印机,有两个进程都需要打印文件,如果直接让他们简单地并发访问打印机,那么你很可能什么都打印不出来或者打印的文件是...anyway,我们需要增加一些机制来控制并

哲学家进餐问题

先直接上代码 1 #define N 5 /* 哲学家数目 */ 2 #define LEFT (i+N-1)%N /* i的左邻编号 */ 3 #define RIGHT (i+ 1)%N /* i的右邻编号 */ 4 #define THINKING 0 /* 哲学家在思考 */ 5 #define HUNGRY 1 /*哲学家试图拿起叉子 */ 6 #define EATING 2 /* 哲学家进餐 */ 7 typedef int semaphore; /*信号量 */ 8 int st

利用Linux下的pthread_mutex_t类型来实现哲学家进餐问题

首先说一下什么是哲学家进餐问题,这是操作系统课程中一个经典的同步问题, 问题如下:如上图,有6个哲学家和6根筷子(那个蓝色部分表示哲学家,那个紫色长条部分表示筷子),他们分别被编了0~5的号!如果某个哲学家想要进餐的话,必须同时拿起左手和右手边的两根筷子才能进餐!哲学家进餐完毕之后,就放下手中拿起的两根筷子!这样其他哲学家就能拿这些筷子进餐了!注意这个哲学家的个数必须是偶数个! OK,这样就可能存在一个死锁问题,比如0号哲学家拿了0号筷子,1号哲学家拿了1号筷子!如此往复,最终的结果就是每个哲学

【操作系统总结】哲学家进餐问题

哲学家进餐问题 问题:有五个哲学家公用一张圆桌,分别坐在周围的五张椅子上,在圆桌上有五个碗和五只筷子,平时一个哲学家进行思考,饿的时候便取用左右做靠近他的筷子,只有他拿到两只筷子时才能进餐,进餐完毕继续思考 利用记录型信号量解决问题 semaphore chopstick[5] = {1, 1, 1, 1, 1};//每一个筷子一个信号量 do { wait(chopstick[i]);//首先这个筷子能不能拿到,否则自我阻塞 wait(chopstick[(i + 1) % 5]);//再判断

用信号量解决生产者消费者问题

用信号量解决生产者消费者问题: ipc.h #ifndef _IPC_H_ #define _IPC_H_ #include <sys/types.h> #include <unistd.h> #include <sys/ipc.h> #include <sys/sem.h> #include <sys/shm.h> #include <errno.h> #include <stdio.h> #include <st