获得最大并行度的哲学家问题解法

上传人:ldj****22 文档编号:40517480 上传时间:2018-05-26 格式:DOC 页数:2 大小:30.50KB
返回 下载 相关 举报
获得最大并行度的哲学家问题解法_第1页
第1页 / 共2页
获得最大并行度的哲学家问题解法_第2页
第2页 / 共2页
亲,该文档总共2页,全部预览完了,如果喜欢就下载吧!
资源描述

《获得最大并行度的哲学家问题解法》由会员分享,可在线阅读,更多相关《获得最大并行度的哲学家问题解法(2页珍藏版)》请在金锄头文库上搜索。

1、 获得最大并行度的哲学家问题解法图 2 18 中的解法不仅正确,而且对于任意位哲学家的情况都能 获得最大的并行度。其中使用一个数组state 来跟踪一个哲学家 是在吃饭、思考还是正在试图拿叉子。一个哲学家只有在两个邻居都 不在进餐时才允许转移到进餐状态。第i 位哲学家的邻居由宏 LEFT 和 RIGHT 定义,换言之,若i 为 2,则 LEFT 为 1, RIGHT 为 3。 # define N 5 /* 哲学家数目 */ # define LEFT (i-1+N)%N /* i 的左邻号码 */ # define RIGHT (i+1)%N /* i 的右邻号码 */ # define T

2、HINKING 0 /* 哲学家正在思考 */ # define HUNGRY 1 /* 哲学家想取得叉子 */ # define EATING 2 /* 哲学家正在吃面 */typedef int semaphore; /* 信号量是一个特殊的整型变量 */ int stateN; /* 记录每个人状态的数组 */ semaphore mutex=1; /* 临界区互斥 */ semaphore sN; /* 每个哲学家一个信号量 */void philosopher(int i) /* i:哲学家号码,从 0 到 N-1 */ while(TRUE) /* 无限循环 */ think();

3、 /* 哲学家正在思考 */ take_forks(i); /* 需要两只叉子,或者阻塞 */ eat(); /* 进餐 */ put_forks(i); /* 把两把叉子同时放回桌子 */ void take_forks(int i) /* i:哲学家号码从 0 到 N-1 */ down( /* 进入临界区 */ statei=HUNGRY; /* 记录下哲学家 i 饥饿的事实 */ test(i); /* 试图得到两只叉子 */ up( /* 离开临界区 */ down( /* 如果得不到叉子就阻塞 */ void put_forks(int I) /* i:哲学家号码从 0 到 N-1

4、 */ down( /* 进入临界区 */ statei=THINKING; /* 哲学家进餐结束 */ test(LEFT); /* 看一下左邻居现在是否能进餐 */ test(RIGHT); /* 看一下右邻居现在是否能进餐 */ up( /* 离开临界区 */ void test(i) /* i:哲学家号码从 0 到 N-1 */ if(statei=HUNGRY up( 图 2-18 一个哲学家就餐问题的解决方案该程序使用了一个信号量数组,每个信号量对应一位哲学家,这 样在所需的叉子被占用时,想进餐的哲学家可以阻塞。注意每个进程 将过程philosopher 作为主代码运行,而其他过程 take_forks、 put_forks 和 test 只是普通的过程,而非单独的进 程。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号