当前位置:文档之家› 哲学家用餐问题

哲学家用餐问题


哲学家一(线程一函数)
读懂整 个程序。 请写出其余两个线程 的函数Thread2Proc 和 Thread3Proc ,使他们 都先取右边的筷子, 后取左边的筷子。执 行,写出实验结果或 现象。回答问题(3)
(2)描述一个既没有两座同时吃饭,又没有人饿死(永远拿 到到筷子)的算法。
• 对上面的程序Байду номын сангаас行改进,完成题目(2)要求。
选做题:
• 根据以前做过的实验,把算法移植到给定的图形用户界 面(GUI)框架程序中,每个线程创建自己的窗口,每个哲 学家的吃饭和取筷子信息显示在自己的窗口界面中,每 个窗口中右键单击时开始取筷子和吃饭的过程。 • 为降低图形化开发的难度,可以只设计三个哲学家线程, 每个线程设计自己的线程函数(即不合并线程函数)。 • 执行时以各种顺序在三个窗口中右击,验证执行结果。
• 思考:改变放下左右两边的筷子的顺序会有影 响吗?验证执行。
程序改进二: 把三个线程函数合并成一个统一的线程函数,哲学家的编号由 线程的函数参数传入,根据前面的程序代码完成省咯号处的设 计,并完成主函数的相应修改。执行,记录结果。
DWORD WINAPI ThreadProc( LPVOID lpParameter ) { int index; index=*(int *)lpParameter; …… return 0; } int main() { int num=1; h_Thread[0]=CreateThread(NULL,0 ,ThreadProc,&num ,0,NULL); num++; h_Thread[1]=CreateThread(NULL,0 ,ThreadProc,&num ,0,NULL); num++; h_Thread[2]=CreateThread(NULL,0 ,ThreadProc,&num ,0,NULL); }
实验:哲学家用餐问题
设有5个哲学家,共享一张放有五把椅子的桌子,每人分得一 把椅子。但是,桌子上总共只有5支筷子,在每人两边分开各 放一支,哲学家们在肚子饥饿时才试图分两次从两边拾起筷 子就餐。 条件: (1)只有拿到两支筷子时,哲学家才能吃饭 (2)如果筷子已在他人手上,则该哲学家必须等到他人吃完 之后才能拿到筷子。 (3)任一哲学家在自己未拿到两去筷子吃饭之前,决不放下 自己手中的筷子。 试解答以下问题: (1)描述一个保证不会出现两个邻座同时要求吃饭的通信算 法。 (2)描述一个既没有两座同时吃饭,又没有人饿死(永远拿 到到筷子)的算法。 (3)什么 情况下,5人全吃不上饭?
程序改进三: 把#define NUM 3语句中的3 改成5,把主函数中的三个创建线 程的语句用循环实现。执行,记录结果,分析问题产生的原因, 并解决。
提示:线程函数的参数值有可能是取到在主函数中的循环进入 下一轮时(即循环变量i值已经变化)的值。解决:在每次循环 结束时休眠一会儿,让线程函数能取到正确的参数值。
(1)描述一个保证不会出现两个邻座同时要求吃饭的通信算法。 三个哲学家三支筷子的情形:
1 要保证不会出现1与2同时吃饭,只需要保证他们对中间的 筷子互斥使用即可 要保证不会出现任意两个邻座同时要求吃饭,也只需要保 证他们对中间的筷子互斥使用即可
使用三个线程模拟三个哲学家用餐,三支筷子用三个互斥对象表示: 建立一个控制台类型工程,代码如下:
相关主题