欢迎来到天天文库
浏览记录
ID:30150102
大小:91.54 KB
页数:12页
时间:2018-12-27
《《哲学家进餐问题》word版》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、哲学家进餐问题2007/05/1612:36P.M./********************philosophers.cpp哲学家进餐问题在多线程中如何避免死锁。问题描述:有五位哲学家围绕着餐桌坐,每一位哲学家要么思考要么等待,要么吃饭。为了吃饭,哲学家必须拿起两双筷子(分别放于左右两端)不幸的是,筷子的数量和哲学家相等,所以每只筷子必须由两位哲学家共享下面是一种有问题的解法,因为在某个时刻,五个哲学家同时拿起五根左手边的筷子,则它们会在同一时候对待右手边的筷子,这样会陷入死锁,但是我测试了,这样的几率并不高经过
2、几个小时,还没有出现。但是我们可以肯定,理论上是肯定会出现死锁的,我们不能老是靠运气办事,怎么解决这个问题呢留给下一步的学习吧要编译此文件请用多线程版的c++库********************/#include#include#include#include#includeusingnamespacestd;unsignedint__stdcallphilosopher(void*);voidthinking(i
3、nt);voideating(int);voidwait_to_eat(int);voidoutline(int,constchar*);//全局变量CRITICAL_SECTIONcrout;//这个变量用来保证输出时不会竞争CRITICAL_SECTIONfork[5];//定义五个临界变量,代表五更筷子intmain(intargc,char*argv[]){void*hthread[5];inti;unsignedintthreadid[5];intarg[5];intcount=5;unsignedlon
4、gretval;InitializeCriticalSection(&crout);//初始化临界变量for(i=0;i<5;i++){ InitializeCriticalSection(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)//如果线程创建失败
5、返回-1 { cerr<<"errorwhilecreatethread"<
6、;i++){ if(CloseHandle(hthread[i])==false)//关闭句柄 { cerr<<"errorwhileclosethread"<
7、];outline(n,"isin!");srand(time(NULL));while(true){ thinking(n); wait_to_eat(n); eating(n);}outline(n,"isout!");returnn;}/*************思考随机一段时间*************/voidthinking(intk){outline(k,"isthinking...");Sleep((rand()%1000)*5);}/*************吃饭随机一段时间********
8、*****/voideating(intk){outline(k,"iseating...");Sleep((rand()%1000)*5);LeaveCriticalSection(fork+(k+1)%5);//放下右边的筷子//outline(k,"giveleft");LeaveCriticalSection(fork+k);//放下左边的筷子//o
此文档下载收益归作者所有