首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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; } 程序运行后结果如下图...,每个哲学家都可以正常的就餐了:

29810
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

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

    哲学家就餐问题是描述死锁的经典例子。为了防止死锁,可以采用资源预分配法或者资源按序分配法。...【2】数据及程序结构 总共创建有四个类:哲学家进餐问题类,Philosopher类,ChopstickArray 类,Chopstick类。...Random().nextInt(100)); }**catch**(Exception e) { e.printStackTrace(); } } } state = **true**; 哲学家进餐问题类建立一个小程序界面...实习中还有对LINUX操作系统内核代码的分析,使我们具体的认识了LINUX,了解其设计思想和功能模块,而在LINUX下的各种常用命令也要求我们熟练掌握。...而在编写小程序的时候,在同学们和老师的帮助下解决的了很多的困难。而其中对于多线程的编程对于解决并发性问题高效性也在实习中有了深刻的了解。

    53830

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

    我们这里就死磕一下其中的死锁问题。 哲学家进餐问题 哲学家进餐问题是描述死锁最经典的问题,我们后续整个文章都会以此为出发点来讨论,现在先列出来哲学家进餐的问题描述。...问题场景是五个哲学家围绕一个圆桌就做,桌上摆着五只(不是五双)筷子。哲学家的状态可能是“思考”或者“饥饿”。如果饥饿,哲学家就将拿起他两边的筷子并就餐一段时间。就餐结束,哲学家就会放回筷子。...文章组织 本文主要是讲哲学家进餐问题,因此有必要先回顾一些锁的知识,然后会通过四个版本的程序来解决哲学家进餐问题,最后一个简单的总结。 在这里先说明四个版本的程序有什么区别: 经典的内置锁解决方案。...在ReentrantLock的基础上引入条件变量,更优雅的解决问题。 每个版本的程序都会有完整的代码实现,并且有每种方式的优缺点,以及和其它方式的区别。...文中写了四个程序,相对来讲,它们还算是循循渐进,每一个程序都会解决上一个程序的一些问题,最后逐步将多线程编程引向一个更优雅的路上。

    1.7K40

    【Linux笔记】Linux下编译C语言程序

    在上一篇笔记中有分享Linux下的vi/vim编辑器的使用方法(【Linux笔记】Vi/Vim编辑器),现在我们就可以使用vi/vim编辑器编写C代码了。那么写完代码该怎么进行编译呢?...关于在Windows命令行下编译C程序的方法可查看往期笔记:【C语言笔记】windows命令行下编译C程序、【C语言笔记】使用notepad++、MinGW来开发C程序。...以上就是在Linux下编译C程序的基本方法,适用于源文件不多的情况。后续的笔记中还会分享其他编译方法,欢迎持续关注!如果你觉得对你有用的话,麻烦帮忙点个赞。...在Linux下进行C语言编程的学习可能会增加学习的成本,但是从长远来看仍然是有必要的。...若不想安装Linux系统,也想适应一下Linux环境,则可参考往期笔记:【C语言笔记】Windows下体验Linux环境。

    12.5K10

    如何在UbuntuDebian Linux编写C程序

    /my_program这只是如何在 Linux 中编译和运行 C 程序的简要总结。...假设你是 C 语言或 Linux 系统的新手,我将仔细演示这些步骤,以便你能在 Linux 环境中舒服地编写 C 程序。...事实上,我将讨论如何在 Linux 终端中以及在代码编辑器中运行 C 程序的两种方式。...方法 1: 在 Linux 终端中运行 C 程序为了在 Linux 中运行一个 C 程序,你需要在你的系统上有一个 C 编译器。...程序输出显示在编辑器的底部你更喜欢哪一种方法?在 Linux 命令行中运行一些 C 程序是没有问题的,但是使用一个代码编辑器会更容易一些,而且会节省时间。你不觉得吗?你可以自己决定想使用哪一种方法。

    2.7K60

    Linux下c程序的内存映像

    前言 今天开始分享C语言里面的存储类型、作用域、生命周期、链接属性等知识点,我们写完一个程序,不只说知其,更要知其所以然。...(2)内存有多种管理方法:栈、堆、数据段、bss段、.text段等,其实这个Linux环境可以查看以ELF结尾的可执行程序,可以看到所说的这些的;一个变量的存储类属性就是描述这个变量存储在何种内存段中。...(3)研究变量的生命周期可以我们理解程序运行的一些现象、理解C语言的一些规则。 - 链接属性 - (1)大家知道程序从源代码到最终可执行程序,经历的过程:编译、链接。...Linux下c程序的内存映像 - 代码段、只读数据段 - (1)对应着程序中的代码(函数),代码段在linux中又叫文本段(.text)。...- 内核映射区 - (1)内核映射区就是将操作系统内核程序映射到这个区域了。 (2)对于linux中的每一个进程来说,它都以为整个系统中只有它自己和内核而已。

    3K20

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

    哲学家就餐问题由Edsger Dijkstra提出的,该问题是一个经典的死锁问题,该问题的基本描述中是指定五个哲学家。...这些哲学家将花部分时间思考,花部分时间就餐。当他们思考的时候,不需要任何共享资源;但当他们就餐时,将使用有限数量的餐具。在问题的原始描述中,餐具是叉子。...问题中引入的难点是:作为哲学家,他们很穷,所以他们只能买五根筷子(更一般地讲,筷子和哲学家的数量相同)。他们围坐在桌子周围,每人之间放一根筷子。...当一个哲学家要就餐的时候,这个哲学家必须同时得到左边和右边的筷子。上述问题会产生死锁的情况,当5个哲学家都拿起自己左或者右手手边的筷子,准备拿右手或者左手边的筷子时产生死锁现象。...在程序中,防止死锁最容易的方法是破坏第4个条件。有这个条件的原因是每个Philosopher都试图用特定的顺序拿Chopstick:先右后左。

    17430

    linux下使用gcc编译运行C程序

    gcc(GNU Compiler Collection)是Linux下最常用的C语言编译器,是GNU项目中符合ANSI C标准的编译系统,能够编译用C、C++和Object C等语言编写的程序。 ...在linux系统中,常见的使用方法有两种,如下: gcc -o out in1 in2 //gcc编译以及链接(对in1文件和in2文件进行编译生成...out.o文件,“-c”:表示只生成*.o文件) 若在arm板里运行,就需要在linux系统中使用arm-linux-gcc交叉编译才行: arm-linux-gcc -o out in1...in2 //gcc编译以及链接(对in1文件和in2文件进行编译生成out.bin文件,“-o”:表示生成可执行文件) arm-linux-gcc -c...以编译两个程序a.c和hello.c为示例: vi a.c                                 //编辑a.c , 它将被hello.c调用,前提是这两个文件必须在同一目录下

    6.2K70

    linux下使用gcc编译运行C程序

    gcc(GNU Compiler Collection)是Linux下最常用的C语言编译器,是GNU项目中符合ANSI C标准的编译系统,能够编译用C、C++和Object C等语言编写的程序。 ...在linux系统中,常见的使用方法有两种,如下: gcc -o out in1 in2 //gcc编译以及链接(对in1文件和in2文件进行编译生成...out.o文件,“-c”:表示只生成*.o文件) 若在arm板里运行,就需要在linux系统中使用arm-linux-gcc交叉编译才行: arm-linux-gcc -o out in1...in2 //gcc编译以及链接(对in1文件和in2文件进行编译生成out.bin文件,“-o”:表示生成可执行文件) arm-linux-gcc -c...以编译两个程序a.c和hello.c为示例: vi a.c                                 //编辑a.c , 它将被hello.c调用,前提是这两个文件必须在同一目录下

    7.4K90

    在Linux上用Eclipse写C++程序

    我厂很多同学使用VC在windows上编写linux的C/C++程序,然后再传的开发服务器上,然后再编译和调试。如果有修改,可能会直接用vi去改了,然后再把源代码同步回来。其实这样做挺折腾的。...但是,也有另外一个方案,就是在 Linux上安装个写C/C++程序的IDE,这样可以直接编写、编译、运行、上传SVN,非常方便。...其实要做到这点,也很简单: 你需要一个虚拟机来运行一个带GUI的LINUX,这样IDE才能运行起来,当然也可以直接在开发服务器上安装GUI程序,然后WINDOWS的办公PC这里设置个SSH的X转发,装个...注意Eclipse有很多个包,如果只写C/C++程序,就直接下Eclipse CDT这个套件好了,省了还要下支持JAVA开发的东西。 ?...subclipse可以把SVN整合到Eclispe里面,但是这两个功能在我的虚拟机上常常出问题,所以SVN还是用的命令行,界面就维持的英文的。

    3.4K70

    Linux C程序真的不能访问NULL指针吗?

    这可能会对程序数据造成严重的伤害。 因此有必要人为规定一个 非法地址 ,这样在程序中就可以做判断了,只要不是人为规定的那个非法地址,那就是合法的。...首先我们写个简单的C程序: // gcc access0.c -o access0#include #include #include int...下面该写内核模块了,为了简化操作,这里采用Guru模式的stap脚本来进行编程: // mapNULL.stp%{#include linux/mm.h>#include linux/sched.h.../ make -C /lib/modules/`uname -r`/build SUBDIRS=`pwd` modules#include linux/mm.h>#include linux/sched.h...---- 前天晚上,有位朋友问了我一个问题,为了备忘,我昨天发了一则朋友圈: 昨天有人问我说为什么NULL指针不能访问,我说NULL指针是可以访问的,NULL就是0,0也是一个合法地址,为什么不能访问?

    3.4K10

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

    一、我们在前面讲进程间通信的时候提到过进程互斥的概念,下面写个程序来模拟一下,程序流程如下图: 即父进程打印字符O,子进程打印字符X,每次打印一个字符后要sleep 一下,这里要演示的效果是,在打印程序的边界有...        fflush(stdout);         pause_time = rand() % 3;         sleep(pause_time);         printf("%c"...二、哲学家就餐问题的描述可以参考这里,下面我们尝试解决这个问题的方法是:仅当一个哲学家两边筷子都可用时才允许他拿筷子。...上图中红色数字表示哲学家的编号,总共5个哲学家,用5个进程来表示;黑色数字表示筷子的编号,总共有5根筷子,可以定义一个信号量集中含有5个信号量,每个信号量的初始值为1,当某个哲学家可以同时得到两根筷子(...如果发现程序没有运行卡着,即没有发生死锁现象,从中也可以发现同时最多只能有两个哲学家一起用餐,也不会出现相邻哲学家一起用餐的情况。 参考: 《UNP》

    1.3K00

    在Linux(Ubuntu版)下编写运行C语言程序

    最初学习C语言用的是Visual C++6.0,后来还用过一些IDE,复制粘贴都可以用鼠标对目标进行选择即可。但在Linux系统里,需要熟练掌握在Terminal里编写C语言程序,进行编译调试。...本章主要介绍在Linux的终端下编写C程序并编译运行。...一,编写C时需要掌握的一些Linux操作 (1)文件管理相关的命令 Linux命令名称 作用 使用举例 mkdir 新建文件夹 mkdir test,mkdir -p test1/test2/test3...二、使用vi编辑器编写C程序 (1)打开Terminal(终端),建立相关目录,在该目录下执行“vi test.c”,将新建一个名为test.c的文件并进入(此时未保存,保存后该文件才存在)。...(2)使用前文提到的命令编写C程序,保存并退出。 (3)使用 gcc test.c -o test 和 ./test 编译生成文件并运行。

    4.2K30

    C++程序员经常问的11个问题

    C++程序员经常问的11个问题 这篇文章收了好长时间,但还是觉得贴出来,作为收藏,在网上这样的浮躁环境,很少能认认真真地看这样长的文章,有时间我也要把《Effective C++》的读书笔记作出来...以下是原文: 下面的这些要点是对所有的C++程序员都适用的。我之所以说它们是最重要的,是因为这些要点中提到的是你通常在C++书中或网站上无法找到的。...如:指向成员的指针,这是许多资料中都不愿提到的地方,也是经常出错的地方,甚至是对一些高级的C++程序员也是如此。   这里的要点不仅仅是解释怎样写出更好的代码,更多的是展现出语言规则里面的东西。...很显然,它们对C++程序员来说是永久的好资料。我相信这一篇文章会使你收获不小。   首先,我把一些由不同层次的C++程序员经常问的问题归到一起。...我惊奇的发现有很多是有经验的程序员都还没意识到 .h 符号是否还应该出现在标准头文件中。 要点1: 还是 ?    很多C++程序员还在使用而不是用更新的标准的库。这两者都有什么不同呢?

    86520
    领券