2019哲学家用餐

sem bowl;
sem chopsticks[n];
for(int i=0;i<n;i++)
    chopsticks[i].value=1;
bowl.value=min(n-1,m)//bowl.value<=n-1,确保不死锁
while(True)
{
    p(bowl);
    p(chopsticks[i]);
    p(chopsticks[(i+1]MOD n);
    就餐;
    v(chopsticks[i]);
    v(chopsticks[(i+1]MOD n);
    v(bowl);
}

原文地址:https://www.cnblogs.com/yangmenda/p/11708061.html

时间: 2024-10-22 15:25:17

2019哲学家用餐的相关文章

哲学家用餐问题的几个解法(c语言实现)

参考资料: 1.维基百科:哲学家用餐问题 2.Windows的多线程编程

java 线程 死锁(哲学家用餐案例讲解) -------thinking java 4

package org.rui.thread.deadlock; /** * 死鎖 * * 筷子 * * @author lenovo * */ public class Chopstick { private boolean taken = false; public synchronized void take() throws InterruptedException { while (taken) { wait(); } taken = true; } public synchroniz

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

线程高级

例题,哲学家用餐: 在一张餐桌上坐着五个哲学家,但是却只有五根筷子,每个哲学家只有一根筷子,所以当一个哲学家要夹菜的时候需要用他旁边那个哲学家的筷子,被拿走筷子的哲学家则只能等待那个哲学家吃完放下筷子他才能夹菜. 示意图:  设计思路: 首先编写一个筷子类,每根筷子都是一个对象,这个类里有拿起.放下两个方法:当一个哲学家线程来调用拿起方法时,下一个哲学家线程就要进入等待状态,然后这个哲学家线程调用放下方法后,就激活那个等待中的哲学家线程,以此循环,轮流使用筷子. 代码示例:  接着设计哲学家类,

linux服务器开发二(系统编程)--线程相关

线程概念 什么是线程 LWP:Light Weight Process,轻量级的进程,本质仍是进程(在Linux环境下). 进程:独立地址空间,拥有PCB. 线程:也有PCB,但没有独立的地址空间(共享). 进程与线程的区别:在于是否共享地址空间. 独居(进程). 合租(线程). Linux下: 线程:最小的执行单位. 进程:最小分配资源单位,可看成是一个线程的进程. 安装man文档 sudo apt-get install glibc-doc sudo apt-get install manp

操作系统:设计与实现 读笔(1)

第一章,引言,草草略过,大致了解了,概要如下: 对操作系统有两种观点:资源管理器观点和扩展的计算机观点.从资源管理器观点看,操作系统的任务是高效地管理整个系统的各个部分:从扩展的计算机观点看,其任务是为用户提供一台比物理计算机更易于使用的虚拟计算机.操作系统的历史很长,从早期的代替操作员手工操作的系统,到现在的多道程序系统.任何操作系统的核心都是一套系统调用,系统调用界定了操作系统能完成的功能.对于MINIX,其系统调用分为六大类,第一类与进程创建和终止有关.第二类处理信号.第三类针对文件读写.

线程高级.md

例题,哲学家用餐: 在一张餐桌上坐着五个哲学家,但是却只有五根筷子,每个哲学家只有一根筷子,所以当一个哲学家要夹菜的时候需要用他旁边那个哲学家的筷子,被拿走筷子的哲学家则只能等待那个哲学家吃完放下筷子他才能夹菜. 示意图:  设计思路: 首先编写一个筷子类,每根筷子都是一个对象,这个类里有拿起.放下两个方法:当一个哲学家线程来调用拿起方法时,下一个哲学家线程就要进入等待状态,然后这个哲学家线程调用放下方法后,就激活那个等待中的哲学家线程,以此循环,轮流使用筷子. 代码示例:  接着设计哲学家类,

linux网络编程-----&gt;线程死锁

开发使用多线程过程中, 不可避免的会出现多个线程同时操作同一块共享资源, 当操作全部为读时, 不会出现未知结果, 一旦当某个线程操作中有写操作时, 就会出现数据不同步的事件. 而出现数据混乱的原因: 资源共享(独享资源则不会) 调试随机(对数据的访问会出现竞争) 线程间缺少必要的同步机制 以上三点, 前两点不能被改变. 欲提高效率, 传递数据, 资源必须共享. 只要资源共享, 就一定会出现线程间资源竞争, 只要存在竞争关系, 数据就会出现混乱. 所以只能从第三点着手, 使多个线程在访问共享资源的

10个精妙的Java编码最佳实践

这是一个比Josh Bloch的Effective Java规则更精妙的10条Java编码实践的列表.和Josh Bloch的列表容易学习并且关注日常情况相比,这个列表将包含涉及API/SPI设计中不常见的情况,可能有很大影响. 我在编写和维护jOOQ(Java中内部DSL建模的SQL)时遇到过这些.作为一个内部DSL,jOOQ最大限度的挑战了Java的编译器和泛型,把泛型,可变参数和重载结合在一起,Josh Bloch可能不会推荐的这种太宽泛的API. 让我与你分享10个微妙的Java编码最佳