①总体思路:

都去拿左边的筷子,并且最后一个人不能去拿筷子(防止大家都拿了左边的筷子,没有右边的筷子,导致死锁了),解决死锁问题的办法就是同时只允许四位哲学家同时拿起同一边的筷子,这样就能保证一定会有一位哲学家能够拿起两根筷子完成进食并释放资源,供其他哲学家使用,从而实现永动,避免了死锁。举个最简单的栗子,假定0~3号哲学家已经拿起了他左边的筷子,然后当4号哲学家企图去拿他左边的筷子的时候,将该哲学家的线程锁住,使其拿不到其左边的筷子,然后其左边的筷子就可以被3号哲学家拿到,然后3号哲学家进餐,释放筷子,然后更多的哲学家拿到筷子并进餐。

如何才能实现当4号哲学家企图拿起其左边的筷子的时候将该哲学家的线程阻塞?这个时候就要用到该问题的提出者迪杰斯特拉(这货还提出了迪杰斯特拉最短路径算法,著名的银行家算法也是他发明的)提出的信号量机制。因为同时只允许有四位哲学家同时拿起左筷子,因此我们可以设置一个信号量r,使其初始值为4,然后每当一位哲学家企图去拿起他左边的筷子的时候,先对信号量做一次P操作,从而当第五位哲学家企图去拿做筷子的时候,对r做一次P操作,r = -1,由r < 0得第五位哲学家的线程被阻塞,从而不能拿起左筷子,因此也就避免了死锁问题。然后当哲学家放下他左边的筷子的时候,就对r做一次V操作。

②在主线程和子线程中,避免了竞争关系.

代码参考如下:

/***********************************

* @file linux_zexuejia.c

* @copyright 月光下的脚步 Co.,Ltd.ALL Right Reserved

* @brief 使用信号量和互斥锁完成,哲学家就餐问题。

* @author 王有康

* @data 2019、7、31

* @version V1.1

* @Last Modified 2018/10/25 wangyoukang

* @note 当前版本是v1.1版本,以后需要修改,可以在上添加版本和修改日期

* @note

* @warning

* @Function List :

************************************/

#include

#include

#include

#include

#include

#include

#include

#define N 5

//互斥锁

pthread_mutex_t chops[N];

//信号量

sem_t r;

/**********************

* @fn philosopher

* @biref 每次只有4个人能够获得左手资源,这样不会死锁

* @param philosopher number

* @return

* @other

***********************/

void philosopher(void *arg)

{

int i = *(int *)arg;

int left = i;

int right = (i + 1)%N;

while(1)

{

printf("哲学家%d在思考问题\n",i);

usleep(1000);

printf("哲学家%d饿了\n",i);

sem_wait(&r);

pthread_mutex_lock(&chops[left]);

printf("philosopher %d take left lock\n",i);

pthread_mutex_lock(&chops[right]);

printf("philosopher %d take right lock\n",i);

printf("philosopher %d eat\n",i);

usleep(1000);

pthread_mutex_unlock(&chops[right]);

printf("philosopher %d release right lock\n",i);

pthread_mutex_unlock(&chops[left]);

printf("philosopher %d realease left lock\n",i);

sem_post(&r);

}

}

/**********************

* @fn philosopher

* @biref 主函数

* @param

* @return

* @other

***********************/

int main(int argc,char **argv)

{

int i = 0,*ptr;

pthread_t tid[N];

for(i = 0;i < N;i++)

{

pthread_mutex_init(&chops[i],NULL);

}

sem_init(&r,0,4);

for(i = 0;i < N;i++)

{

//防止主线程和对等线程竞争,给线程和主线程分配不同的内存区域。其实这个地方和线程安全中的分配不同内存相似,可以看csapp线程安全

ptr = malloc(sizeof(int));

*ptr = i;

pthread_create(&tid[i],NULL,(void *)philosopher,&i);

}

for( i = 0;i< N;i++)

{

pthread_join(tid[i],NULL);

}

for(i = 0;i < N;i++)

{

pthread_mutex_destroy(&chops[i]);

}

sem_destroy(&r);

return 0;

}

哲学家就餐问题python解决_关于哲学家就餐问题的分析代码.相关推荐

  1. python租房_爬虫深圳租房网站租房分析(python)

    目标:深圳租房信息 数据获取 需要爬取的信息 ----> 分析该网站的html结构,获取这些字段 使用requests,BeautifulSoup,,,各种包爬取数据 得到的csv如下: 数据清 ...

  2. Python批量读取公司年报并进行情感分析--代码实战

    该文章代码均在jupyter Notebook中运行,且已安装相关包 import jieba import os import csv# 读取预定的情感词列表 def read_dict(file) ...

  3. 利用Python解决最短路径问题

    利用Python解决最短路径问题 题意 运行限制 解题思路 代码 法一(基于最短路径长度递增): 法二(基于图论中的最短路径算法): 推荐练习 题意 一图由 2021 个结点组成,依次编号 1 至 2 ...

  4. python解决哲学家就餐问题(and型信号量)

    最近操作系统刚学完这部分内容,老师要求下去自己实践一下,在网上看了看发现用python解决该问题的博文很少,而且好多都是错的,于是就自己写了一段代码 # and型信号量解决哲学家就餐问题 import ...

  5. 哲学家就餐问题python伪代码_GitHub - doooooit/Dining-philosophers-problem: 哲学家进餐问题的两种解决方法...

    哲学家就餐问题 问题描述 哲学家就餐问题(Dining philosophers problem)可以这样表述,假设有五位哲学家围坐在一张圆形餐桌旁,做以下两件事情之一:吃饭,或者思考.吃东西的时候, ...

  6. python 定义变量_用python解决动态的定义变量名(并给其赋值方法:大数据处理)...

    前言: 今天为大家带来的内容是:用python解决动态的定义变量名(并给其赋值方法:大数据处理)具有很好的参考价值,希望对大家有所帮助.喜欢本文内容的记得点赞转发收藏不迷路哦!!! 最近消费kafka ...

  7. python猴子吃桃问题_用Python解决猴子吃桃问题

    猴子吃桃问题是数学中的一道经典问题,学习过相关数学知识的人固然已经知道该如何解答了,但还没有学到这部分知识的孩子该怎么办呢?其实接触了编程的孩子就可以用编程知识来解决这个问题了,比如Python,下面 ...

  8. Python版本的数据结构书_《用Python解决数据结构与算法问题》

    源于经典 数据结构作为计算机从业人员的必备基础,Java, c 之类的语言有很多这方面的书籍,Python 相对较少, 其中比较著名的一本 problem-solving-with-algorithm ...

  9. python线性整数规划求解_实例详解:用Python解决整数规划问题!

    我们将使用整数规划来做出最佳决策 整数规划(IP)问题是所有变量都被限制为整数的优化问题(指规划中的变量(全部或部分)限制为整数,若在线性模型中,变量限制为整数,则称为整数线性规划).IP问题是有关于 ...

最新文章

  1. Android逆向进阶——让你自由自在脱壳的热身运动(dex篇)
  2. Subversion For Windows的安装与使用
  3. ContentPlaceHolder必须放在具有 runat=server 的窗体标记内
  4. spingboot整合netty实现单聊整合实现
  5. 苹果修改应用商店规则:云游戏服务可上架 但游戏需从商店下载
  6. 厦门one_厦门外代荣获ONE全球船舶操作中心颁发的Sapphire Award奖
  7. 李飞飞为什么会离职 Google?
  8. word 产生很多temp 不显示_word表格中文字显示到最下面的时候不自动换页-解决办法...
  9. 思科模拟器的简单安装和使用
  10. Win10访问不了Samba网络共享的原因以及解决办法
  11. Andriod 实现可拖动列表
  12. 注册gmail账号,手机无法接受验证码的问题
  13. win2003 apache php mysql,浅析Win2003系统中配置Apache+php+mysql的方法
  14. TableView下拉刷新崩溃
  15. 高通正式发布骁龙 778G 5G 芯片
  16. 投资理财里的必然和概率
  17. 《游戏学习》Java实现仿雷电游戏设计
  18. java程序员建议考软考中级的哪一个证书
  19. 听说现在美女都流行吃“脏东西”了,有钱都不一定买得到...丨钛空舱
  20. 05人月神话读书笔记之一

热门文章

  1. 麒麟系统开机自启动服务、执行脚本、命令
  2. 2022/12/4 胡言乱语
  3. 习题5-7 使用函数求余弦函数的近似值 (15分)
  4. 清华大学海洋大数据分析管理平台解读
  5. 求通俗解释下bandit老虎机是个什么东西?
  6. 简单c语言程序(switch语句)输入1-7,输出周一到周日
  7. 阿里云国际版回执消息简介与配置流程
  8. ProGuard入门
  9. App Store 3月下载量下滑
  10. HP-UX 11.31 安装RAC 添加共享磁盘的问题(两种办法)