《哲学家进餐问题》word版.doc

《哲学家进餐问题》word版.doc

ID:49060506

大小:58.30 KB

页数:12页

时间:2020-02-27

《哲学家进餐问题》word版.doc_第1页
《哲学家进餐问题》word版.doc_第2页
《哲学家进餐问题》word版.doc_第3页
《哲学家进餐问题》word版.doc_第4页
《哲学家进餐问题》word版.doc_第5页
资源描述:

《《哲学家进餐问题》word版.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、哲学家进餐问题2007/05/1612:36P.M./********************philosophers.cpp哲学家进餐问题在多线程中如何避免死锁。问题描述:有五位哲学家围绕着餐桌坐,每一位哲学家要么思考要么等待,要么吃饭。为了吃饭,哲学家必须拿起两双筷子(分别放于左右两端)不幸的是,筷子的数量和哲学家相等,所以每只筷子必须由两位哲学家共享下面是一种有问题的解法,因为在某个时刻,五个哲学家同时拿起五根左手边的筷子,则它们会在同一时候对待右手边的筷子,这样会陷入死锁,但是我测试了,这样的几率并不高经过几个小时,还没有出现。但是我们可以肯定,理论上是肯

2、定会出现死锁的,我们不能老是靠运气办事,怎么解决这个问题呢留给下一步的学习吧要编译此文件请用多线程版的c++库********************/#include#include#include#include#includeusingnamespacestd;unsignedint__stdcallphilosopher(void*);voidthinking(int);voideating(int);voidwait_to_eat(int);voidoutli

3、ne(int,constchar*);//全局变量CRITICAL_SECTIONcrout;//这个变量用来保证输出时不会竞争CRITICAL_SECTIONfork[5];//定义五个临界变量,代表五更筷子intmain(intargc,char*argv[]){void*hthread[5];inti;unsignedintthreadid[5];intarg[5];intcount=5;unsignedlongretval;InitializeCriticalSection(&crout);//初始化临界变量for(i=0;i<5;i++){  Initi

4、alizeCriticalSection(fork+i);}//创建五个哲学家for(i=0;i<5;i++){  arg[i]=i;  hthread[i]=(void*)_beginthreadex(NULL,0,philosopher,(void*)(arg+i),0,threadid+i);  if((int)hthread[i]==-1)//如果线程创建失败返回-1  {   cerr<<"errorwhilecreatethread"<

5、等待所有线程结束retval=WaitForMultipleObjects(5,hthread,true,INFINITE);//等待多个线程if(retval==WAIT_FAILED){  cerr<<"waiterror,errorcode:"<

6、ror()<

7、*********/voidthinking(intk){outline(k,"isthinking...");Sleep((rand()%1000)*5);}/*************吃饭随机一段时间*************/voideating(intk){outline(k,"iseating...");Sleep((rand()%1000)*5);LeaveCriticalSection(fork+(k+1)%5);//放下右边的筷子//outline(k,"giveleft");LeaveCriticalSection(fork+k);//放下左边的

8、筷子//o

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。