#include //筷子作为mutex

pthread_mutex_t chopstick[6] ;//定义以筷子为锁的数组

void *eat_think(void *arg)

{

char phi = *(char *)arg; //将任意类型的指针*arg转化为*char类型

int left,right; //左右筷子的编号

switch (phi){

case 'A':

left = 5;

right = 1;

break;

case 'B':

left = 1;

right = 2;

break;

case 'C':

left = 2;

right = 3;

break;

case 'D':

left = 3;

right = 4;

break;

case 'E':

left = 4;

right = 5;

break;

}

int i;

for(;;){

usleep(3); //思考,将进程挂起一段时间

pthread_mutex_lock(&chopstick[left]); //拿起左手的筷子,锁定互斥量,加锁

printf("Philosopher %c fetches chopstick %d\n", phi, left);输出哲学家拿起了左手边的筷子

if (pthread_mutex_trylock(&chopstick[right]) == EBUSY){ //判断右手的筷子是否有人用, 再试一次获得对互斥量的锁定(非阻塞)

pthread_mutex_unlock(&chopstick[left]); //如果右边筷子被拿走放下左手的筷子,解锁互斥量,解锁

continue;//如果此哲学家没能吃饭,验证下一个哲学家是否能吃饭,即跳出本次循环进行下次循环

}

// pthread_mutex_lock(&chopstick[right]); //拿起右手的筷子,如果想观察死锁,把上一句if注释掉,再把这一句的注释去掉

printf("Philosopher %c fetches chopstick %d\n", phi, right); //输出此哲学家又拿起了右手边的跨子

printf("Philosopher %c is eating.\n",phi);//输出此次的哲学家拿起啦一双筷子在吃饭

usleep(3); //吃饭,把进程挂起一段时间

pthread_mutex_unlock(&chopstick[left]); //放下左手的筷子

printf("Philosopher %c release chopstick %d\n", phi, left);

pthread_mutex_unlock(&chopstick[right]); //放下右手的筷子

printf("Philosopher %c release chopstick %d\n", phi, right);

}

}

int main(){

pthread_t A,B,C,D,E; //5个哲学家

int i;

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

pthread_mutex_init(&chopstick[i],NULL);//初始化默认互斥锁属性的互斥锁数组chopstick[i],默认属性为快速互斥锁

pthread_create(&A,NULL, eat_think, "A");创建并跳转到线程函数创建并跳转到参数为指向线程标识符的指针为 A 线程函数eat_think,A是运行函数的参数

pthread_create(&B,NULL, eat_think, "B");

pthread_create(&C,NULL, eat_think, "C");

pthread_create(&D,NULL, eat_think, "D");

pthread_create(&E,NULL, eat_think, "E");

pthread_join(A,NULL);//等待线程标识符为 A 的eat_think线程函数结束

pthread_join(B,NULL);

pthread_join(C,NULL);

pthread_join(D,NULL);

pthread_join(E,NULL);

return 0;

}

哲学家就餐问题linux源代码,Linux下实现哲学家就餐问题相关推荐

  1. nvidia命令不可用linux,在Linux命令行下如何正确配置nVIDIA显卡

    在图形芯片领域,nVidia是一个后来者,它的历史仅相当于ATi的一半.1993年初,NVIDIA 由 Jen-Hsun Huang,,Chris Malachowsky和 Curtis Priem ...

  2. linux 内核round-robin scheduler代码,LINUX源代码阅读报告

    进程调度代码分析 --关于LINUX源代码中进程调度部分的读书报告 在多进程的操作系统中,进程调度是一个全局性.关键性的问题,它对系统的总体设计.系统的的实现.功能设置以及各个方面的性能都有着决定性的 ...

  3. 非常好!!!Linux源代码阅读——环境准备【转】

    Linux源代码阅读--环境准备 转自:http://home.ustc.edu.cn/~boj/courses/linux_kernel/0_prepare.html 目录 Linux 系统环境准备 ...

  4. Linux 源代码 安装vsftpd 2.3.4

    Linux 源代码 安装vsftpd 2.3.4 2011-10-22 12:15:40|  分类: Unix/Linux 笔记 |  标签:linux  vsftpd  |举报|字号 订阅 wget ...

  5. java aix 移植linux,[转]程序的可移植性:window,linux,aix,solaris下程序移植体会

    程序的可移植性:window,linux,aix,solaris下程序移植体会 - [工作学习] 1.类型 我们知道,在Windows平台中,系统定义了很多诸如BOOL,CHAR,ULONG,HAND ...

  6. mysql中文问号 linux,解决Linux系统下Mysql数据库中文显示成问号的问题

    Linux系统下 MYSQL数据库中的数据库文件在本机内迁移 (需暂停服务的方式) Linux系统下 MYSQL数据库中的数据库文件在本机内迁移 本机采用Ubuntu16.04系统,tar方式安装My ...

  7. Linux 源代码阅读知识点及要求

    说明:1.本次源代码阅读,以Linux 最新的稳定版本(2.6)为主: 2.源代码下载地址: 在官方站点 www.kernel.org 上最新稳定版本是 2.6.13.2: 在清华的 ftp 上随时都 ...

  8. CentOS 7 Linux实时内核下的epoll性能分析

    CentOS 7 Linux实时内核下的epoll性能分析 rtoax 2021年3月4日 1. 问题引入 一些参考链接见文末. 1.1. 测试调试环境 非实时环境: 3.10.0-1062.el7. ...

  9. Linux拉取代码启动镜像,基于Linux源代码及Busybox源代码制作精简可启动内核镜像技术实验方法...

    基于Linux源代码及Busybox源代码制作精简可启动内核镜像技术实验方法总结 熊海泉 内核源代码 下载地址 这里下载的是linux-2.6.38.tar.bz源代码 下载地址 这里下载的是busy ...

最新文章

  1. 如何检查linux系统的负载高低
  2. Lombok 安装、入门 - 消除冗长的 java 代码
  3. 编写Eureka入门案例
  4. 安装perl5.10.0
  5. Flutter高内聚组件怎么做?阿里闲鱼打造开源高效方案!
  6. P2345 奶牛集会/P2657 低头一族
  7. java辐射汉化_新研究:低强度环境辐射足以导致量子比特退相干
  8. 25条提高iOS App性能的建议和技巧
  9. 分布式存储绝不简单 —— UCan下午茶-武汉站纪实
  10. java汉字转拼音的处理
  11. Swift进阶 - 更高效的使用集合
  12. android camera 废弃,在Ubuntu系统基于ROS使用废旧Android手机摄像头搭建监控设备
  13. [学习报告]《LeetCode零基础指南》(第五讲) 指针-gyro
  14. 加州大学计算机系统,盘点:美国加州大学系统值得申请的专业
  15. Win10 时间与Internet时间同步超时
  16. 豆瓣电影数据可视化大屏
  17. Python基础知识练习(含答案)
  18. steps()的学习
  19. 连载:面向对象葵花宝典:思想、技巧与实践(10) - “抽象” 详解
  20. “十进制网络”遭质疑 数字域名被当作笑话

热门文章

  1. 与mysql的零距离接触_与MySQL的零距离接触
  2. 【Win32汇编】字符串逆序
  3. SQL语法之基础查询(进阶1)and条件查询(进阶2)
  4. Linux中如何使用Htop监控工具?【网络安全】
  5. 硬件安全系列 逻辑电路基础知识介绍(一)
  6. 【生活】 戴尔XPS 插上耳机之后,说话没声音,麦克风失效 window10 系统
  7. 4、大数字运算(BigInteger类和BigDecimal类)
  8. 访问web服务器--网络实验
  9. python中for循环和while循环的区别_Python中for循环和while循环有什么区别?
  10. python分类算法报告_Python机器学习(1)——决策树分类算法