第一范文网 - 专业文章范例文档资料分享平台

哲学家吃饭问题实验报告操作系统

来源:用户分享 时间:2025/7/5 18:51:54 本文由闁哄鏅炴慨銈夊焻閿燂拷 分享 下载这篇文档手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:xxxxxxx或QQ:xxxxxx 处理(尽可能给您提供完整文档),感谢您的支持与谅解。

目录

1. 设计题目与要求 ??????????????????? 2

设计目的 设计要求

2. 总体设计思想与相关知识 ??????????????? 2

总体设计思想 问题描述 解决方案

3. 数据结构、流程图 ?????????????????? 2

数据结构 流程图

4.

源代码 ???????????????????????

.3

5. 运行结果 ??????????????????????

.6

6. 结果分析 ??????????????????????

.7

7. 总结及心得体会 ???????????????????

.7

1. 设计题目与要求

设计目的

掌握进程同步问题的解决思路及方法, 熟练使用 Windows操作系统提供的信号量机 制解决各种进程同步问题。

设计要求

设有五个哲学家 , 共用一张放有五把椅子的餐桌 , 每人坐在一把椅子上 ,桌子上有五 个碗和五只筷子 , 每人两边各放一只筷子。 哲学家们是交替思考和进餐 , 饥饿时便试图取 其左右最靠近他的筷子。条件 :

(1) 只有拿到两只筷子时 , 哲学家才能吃饭。

(2) 如果筷子已被别人拿走 , 则必须等别人吃完之后才能拿到筷子。

(3) 任意一个哲学家在自己未拿到两只筷子吃饭前 , 不会放下手中拿到的筷子。

2.总体设计思想与相关知识

总体设计思想

哲学家的生活就是思考和吃饭,即思考,饿了就餐,再思考,循环往复。要求是: 每一个哲学家只有在拿到位于他左右的筷子后,才能够就餐;哲学家只能先拿左边的筷 子,再去拿右边的筷子,而不能同时去抓他两边的筷子,也不能从其他哲学家手中抢夺 筷子;哲学家每次就餐后必须放下他手中的两把筷子后恢复思考, 不能强抓住餐具不放。

设计一个程序,能够显示当前各哲学家的状态和桌上餐具的使用情况,并能无死锁 的推算出下一状态各哲学家的状态和桌上餐具的使用情况。 即设计一个能安排哲学家正 常生活的程序。

问题描述 可能出现死锁问题,因为当五个哲学家都饥饿时,都拿着一支筷子,这样就可

能五 个哲学家都用不上餐。

解决方案

最多允许 4 个哲学家同时坐在桌子周围。

给所有哲学家编号,奇数号的哲学家必须首先拿左边的筷子,偶数号的哲学家则 反之。 为了避免死锁,把哲学家分为三种状态,思考,饥饿,进食,仅当一个哲学家左 右两边的筷子

都可用时,才允许他拿筷子,并且一次拿到两只筷子,否则不拿。 3.数据结构及流程图

数据结构

philosopherProc +myid:int +mystate:int +philosopherProc(LPVOIDlpParameter) +ResumeThread(hPhilosopher[i]):int +strcpy(stateStr, \ 程序中定义一个哲学家类,包含两个私有对象和四个公有对象。

myid 对象:报讯哲学家的编号。

mystate 对象:用于保存当前该哲学家的状态,

philosopherProc( LPVOID lpParameter) 方法:哲学家类构造函数, PHILOSOPHER_NUM 表示哲学家

编号

ResumeThread(hPhilosopher[i]) 方法:返回该哲学家编号 strcpy(stateStr, \方法:返回哲学家当前状

根据题目要求改变哲学家的状态(饥饿 -> 进餐-> 思考->饥饿????)

流程图

4. 源代码 (c++)

.... \

ReleaseMutex(mutex);

mystate = THINKING; //

THINKING

leftFork = (myid) % PHILOSOPHER_NUM; rightFork = (myid + 1) % PHILOSOPHER_NUM;

while (true) {

switch(mystate)

{ case THINKING:

mystate = HUNGRY; // strcpy(stateStr, \

break;

case HUNGRY:

strcpy(stateStr, \

ret = WaitForSingleObject(semaphore[leftFork], 0); // 可用 if (ret == WAIT_OBJECT_0)

{

ret = WaitForSingleObject(semaphore[rightFork], 0); // 再检查右筷子是否可用

if (ret == WAIT_OBJECT_0)

{

mystate = DINING; // 变自己的状态 strcpy(stateStr, \

} else {

ReleaseSemaphore(semaphore[leftFork], 1, NULL); // 用,就把左筷子放下 }

} break; case DINING:

// 吃完后把两支筷子都放下

ReleaseSemaphore(semaphore[leftFork], 1, NULL); ReleaseSemaphore(semaphore[rightFork], 1, NULL); mystate = THINKING; // strcpy(stateStr, \

break;

初始状态为

改变状态

先检查左筷子是否

左筷子可用就拿起,

右筷子可用,就改

如果右筷子不可

改变自己的状态

// 输出状态

WaitForSingleObject(mutex, INFINITE);

cout << \ReleaseMutex(mutex);

// sleep a random time : between 1 - 5 s int sleepTime;

sleepTime = 1 + (int)*rand()/(RAND_MAX+); Sleep(sleepTime*10); }

}

int main()

{

int i;

srand(time(0));

mutex = CreateMutex(NULL, false, NULL); for (i=0; i

semaphore[i] = CreateSemaphore(NULL, 1, 1, NULL);

hPhilosopher[i]=CreateThread(NULL,0,philosopherProc,LPVOID(i), CREATE_SUSPENDED,0); }

for (i=0; i

ResumeThread(hPhilosopher[i]); Sleep(2000); return 0;

}

5. 运行结果

搜索更多关于: 哲学家吃饭问题实验报告操作系统 的文档
哲学家吃饭问题实验报告操作系统.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.diyifanwen.net/c0yu2m4z2u11cf865breu5a66i6tmb7010rz_1.html(转载请注明文章来源)
热门推荐
Copyright © 2012-2023 第一范文网 版权所有 免责声明 | 联系我们
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:xxxxxx 邮箱:xxxxxx@qq.com
渝ICP备2023013149号
Top