哲学家进餐问题哲学家进餐问题
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,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。