为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

哲学家进餐问题

2017-10-08 17页 doc 39KB 15阅读

用户头像

is_977556

暂无简介

举报
哲学家进餐问题哲学家进餐问题 2007/05/16 12:36 P.M. /******************** philosophers.cpp 哲学家进餐问题 在多线程中如何避免死锁。 问题描述:有五位哲学家围绕着餐桌坐,每一位哲学家要么思考 要么等待,要么吃饭。为了吃饭,哲学家必须拿起两双筷子(分 别放于左右两端)不幸的是,筷子的数量和哲学家相等,所以每 只筷子必须由两位哲学家共享 下面是一种有问题的解法,因为在某个时刻,五个哲学家同时拿起五根左手边的 筷子, 则它们会在同一时候对待右手边的筷子,这样会陷入死锁,但...
哲学家进餐问题
哲学家进餐问 2007/05/16 12:36 P.M. /******************** philosophers.cpp 哲学家进餐问题 在多线程中如何避免死锁。 问题描述:有五位哲学家围绕着餐桌坐,每一位哲学家要么思考 要么等待,要么吃饭。为了吃饭,哲学家必须拿起两双筷子(分 别放于左右两端)不幸的是,筷子的数量和哲学家相等,所以每 只筷子必须由两位哲学家共享 下面是一种有问题的解法,因为在某个时刻,五个哲学家同时拿起五根左手边的 筷子, 则它们会在同一时候对待右手边的筷子,这样会陷入死锁,但是我测试了,这样的几 率并不高经过几个小时,还没有出现。但是我们可以肯定,理论上是肯定会出现 死锁的, 我们不能老是靠运气办事,怎么解决这个问题呢 留给下一步的学习吧 要编译此文件请用多线程版的c++库 ********************/ #include #include #include #include #include using namespace std; unsigned int __stdcall philosopher(void *); void thinking(int); void eating(int); void wait_to_eat(int); void outline(int ,const char *); //全局变量 CRITICAL_SECTION crout;//这个变量用来保证输出时不会竞争 CRITICAL_SECTION fork[5];//定义五个临界变量,代表五更筷子 int main(int argc,char *argv[]) { void * hthread[5]; int i; unsigned int threadid[5]; int arg[5]; int count = 5; unsigned long retval; 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)//如果线程创建失败返回-1 { cerr << "error while create thread " << i < #include #include #include #include #define NUM_OF_PH 2 //哲学家的个数 using namespace std; unsigned int __stdcall philosopher(void *); void thinking(int); void eating(int); void wait_to_eat(int); void outline(int ,const char *); //全局变量 CRITICAL_SECTION crout;//这个变量用来保证输出时不会竞争 CRITICAL_SECTION fork[NUM_OF_PH];//定义五个临界变量,代表五更筷子 int main(int argc,char *argv[]) { void * hthread[NUM_OF_PH]; int i; unsigned int threadid[NUM_OF_PH]; int arg[NUM_OF_PH]; int count = NUM_OF_PH; unsigned long retval; InitializeCriticalSection(&crout); //初始化临界变量 for(i=0;i #include #include #include #include #define NUM_OF_PH 3 //哲学家的个数 using namespace std; unsigned int __stdcall philosopher(LPVOID); void thinking(int); void eating(int); void wait_to_eat(int); inline void outline(int ,const char *); //全局变量 CRITICAL_SECTION crout;//这个变量用来保证输出时不会竞争 //CRITICAL_SECTION fork[NUM_OF_PH];//定义五个临界变量,代表五更筷子 //修改之后,用了互斥变量两 void *mutex[NUM_OF_PH + 1]; int main(int argc,char *argv[]) { void * hthread[NUM_OF_PH]; int i; unsigned int threadid[NUM_OF_PH]; int arg[NUM_OF_PH]; int count = NUM_OF_PH; unsigned long retval; // InitializeCriticalSection(&crout); //初始化临界变量 for(i=0;i
/
本文档为【哲学家进餐问题】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索