免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2871 | 回复: 2
打印 上一主题 下一主题

[学习] 哲学家就餐问题的直观模拟程序 [复制链接]

论坛徽章:
1
双鱼座
日期:2013-10-22 16:53:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-03-30 11:14 |只看该作者 |倒序浏览
本帖最后由 goodpaperman 于 2015-03-30 13:56 编辑

    前段时间看书上的一个哲学家进餐问题,感觉它的例子不是很好,因为打印一堆诸如:
“Philosopher A fetches chopstick 5
Philosopher B fetches chopstick 1
Philosopher B releases chopstick 1 2 ”
的信息虽然详实,但一点也不直观,如果信息量大的话,分析起来颇为头疼。
    另外,照书上的提示,修改了线程 sleep 时间,发现还是很难产生死锁,这节本是要讲
哲学家就餐死锁的解决方案,但连死锁的现象都产生不了,如何再去谈解决? 所以我决定自己
写一个形象化的易产生死锁的哲学家就餐模拟程序,幸好之前刚学了 pthread 库的接口,
还没有忘掉很多,正好可以拿来一练,
    废话不多说,先来看看运行效果图:

   

    其中,每一行代表一次进餐状态快照,“|” 表示筷子,“O” 表示哲学家,为了便于输出,
这里把围成一圈的哲学家们拉成一长条,一个哲学家“O”旁边有两只筷子“|”,最后的哲学家
右边的筷子折返回来在最左边,这样理解就可以了,
    筷子绿色表示被占用,或者是它左边的哲学家,或者是它右边的,如果哲学家“O”和筷子“|”
之间有“+”,则表示哲学家持有该筷子,哲学家红色表示其状态自上次有改变,这包括取得或
释放任意一侧的筷子,这样便于视力不好的同学观察,
   死锁发生时,所有筷子为绿色,且所有哲学家的持有方向相同(只有单侧),这就是最后
一行的显示。此时主线程监视到死锁(尝试3次,以防线程竞争导致信息不准确),它会将所有线程
取消后退出
    下面来说明一下代码,原理就不多讲了,主要讲几个编译开关。
    USE_SEM 宏表示使用 semaphore 来做筷子,否则使用 mutex;
    USE_KEY 表示使用线程私有存储来取得临时状态,否则使用栈直接传递;
    以上两项可以在 Makefile 编译时设定,注意在使用 mutex ,进程最后退出时会报如下错误:

    pthread_mutex_destroy (&chops[ i ])[27072]: Device or resource busy

    这是由于取消锁定线程不会解锁相应的锁,导致销毁 mutex 时报一个错误,该错误可以忽略不计
    N 表示进餐的哲学家数量,目前为5;
    以上一项可以在源代码中设定。
    这里再补充一句,就是如果更有效的让哲学家们死锁,我之前以为将他们的吃饭、思考时间延长
就可以,实则不然,延长这两个时间只会让你陷入漫长的等待。正确的做法是延长取得第一只筷子
与第二只筷子之间的时间间隔,目前这个设置是1秒,而且为了快速得到死锁结果,就得让哲学家们
不停的转换状态,即缩小就餐与等待时间,目前设置为100毫秒,有兴趣的同学可以调整一下这两个
宏检验一下这个说法:
    WAIT_MAX: 吃饭、思考时间
    WAIT_TIME:取两次筷子间隔

philosopher2.rar (1.76 KB, 下载次数: 50)

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
2 [报告]
发表于 2015-04-06 11:10 |只看该作者
解决死锁不能靠“重现”, 我解决死锁一般靠眼睛。

论坛徽章:
1
双鱼座
日期:2013-10-22 16:53:00
3 [报告]
发表于 2015-04-23 11:56 |只看该作者
回复 2# folklore
靠眼睛怎么解决呀 ?


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP