资源简介
设有五个哲学家,共用一张放有五把椅子的餐桌,每人坐在一把椅子上,桌子上有五个碗和五只筷子,每人两边各放一只筷子。哲学家们是交替思考和进餐,饥饿时便试图取其左右最靠近他的筷子。条件:
(1) 只有拿到两只筷子时,哲学家才能吃饭。
(2) 如果筷子已被别人拿走,则必须等别人吃完之后才能拿到筷子。
(3) 任意一个哲学家在自己未拿到两只筷子吃饭前,不会放下手中拿到的筷子。

代码片段和文件信息
#include
#include
#include
#include
#include
#include
using namespace std; //命名空间std内定义的所有标识符都有效
const unsigned int PHILOSOPHER_NUM=5; //哲学家数目
const char THINKING=1; /*标记当前哲学家的状态1表示等待2表示得到饥饿3表示正在吃饭*/
const char HUNGRY=2;
const char DINING=3;
HANDLE hPhilosopher[5]; //定义数组存放哲学家
/*HANDLE(句柄)是windows操作系统中的一个概念。指的是一个核心对象在某一个进程中的唯一索引*/
HANDLE semaphore[PHILOSOPHER_NUM]; // semaphore 用来表示筷子是否可用
HANDLE mutex; // Mutex用来控制安全输出
DWORD WINAPI philosopherProc( LPVOID lpParameter) //返回 DWORD(32位数据)的 API 函数philosopherProc
{
int myid;
char idStr[128];
char stateStr[128];
char mystate;
int ret;
unsigned int leftFork; //左筷子
unsigned int rightFork; //右筷子
myid = int(lpParameter);
itoa(myid idStr 10);
WaitForSingleobject(mutex INFINITE);
cout << “philosopher “ << myid << “ begin......“ << endl;
ReleaseMutex(mutex);
mystate = THINKING; //初始状态为THINKING
leftFork = (myid) % PHILOSOPHER_NUM;
rightFork = (myid + 1) % PHILOSOPHER_NUM;
while (true)
{
switch(mystate)
{
case THINKING:
mystate = HUNGRY; // 改变状态
strcpy(stateStr “HUNGRY“);
break;
case HUNGRY:
strcpy(stateStr “HUNGRY“);
ret = WaitForSingleobject(semaphore[leftFork] 0); // 先检查左筷子是否可用
if (ret == WAIT_object_0)
{
ret = WaitForSingleobject(semaphore[rightFork] 0); //左筷子可用就拿起,再检查右筷子是否可用
if (ret == WAIT_object_0)
{
mystate = DINING; // 右筷子可用,就改变自己的状态
strcpy(stateStr “DINING“);
}
else
{
ReleaseSemaphore(semaphore[leftFork] 1 NULL); // 如果右筷子不可用,就把左筷子放下
}
}
break;
case DINING:
// 吃完后把两支筷子都放下
ReleaseSemaphore(semaphore[leftFork] 1 NULL);
ReleaseSemaphore(semaphore[rightFork] 1 NULL);
mystate = THINKING; // 改变自己的状态
strcpy(stateStr “THINKING“);
break;
}
// 输出状态
WaitForSingleobject(mutex INFINITE);
cout << “philosopher “ << myid << “ is : “ << stateStr << endl;
ReleaseMutex(mutex);
// sleep a random time : between 1 - 5 s
int sleepTime;
sleepTime = 1 + (int)(5.0*rand()/(RAND_MAX+1.0));
Sleep(sleepTime*10);
}
}
int main()
{
int i;
srand(time(0));
mutex = CreateMutex(NULL false NULL);
for (i=0; i {
semaphore[i] = CreateSemaphore(NULL 1 1 NULL);
hPhilosopher[i]=CreateThread(NULL0philosopherProcLPVOID(i) CREATE_SUSPENDED0);
}
for (i=0; i ResumeThread(hPhilosopher[i]);
Sleep(2000);
return 0;
}
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 177664 2011-09-05 20:01 操作系统课程设计报告.doc
文件 3129 2011-09-07 18:27 philosopher.cpp
----------- --------- ---------- ----- ----
180793 2
- 上一篇:51单片机GPS程序
- 下一篇:MFC下利用IE内核实现简单浏览器
相关资源
- C语言课程设计
- 用回溯法解决八皇后问题C语言实现
- 操作系统课设 读写者问题 c语言实现
- c语言电子商务系统
- 学校超市选址问题(数据结构C语言版
- 数据结构,迷宫问题C语言版源代码
- 宠物管理系统课程设计(源码+数据库
- fluent UDF求解圆柱涡致振动问题(VIV
- 约瑟夫环问题.docx
- c语言课程设计:客房登记系统源码
- 8位竞赛抢答器的课程设计报告.docx
- VC++MFC课程设计的学生成绩管理系统
- C++实现21点游戏
- c++课程设计学生管理系统浙工大源码
- 课程设计: MFC 学生信息管理系统
- dsp课程设计——语音加密.zip
- 广东工业大学数据结构课程设计航空
- 数据结构课程设计扑克牌排序
- c++课程设计宾馆客房管理系统
- c语言课程设计-职工信息管理系统-单
- 飞机票订购系统C语言课程设计报告全
- c++ 课程设计_中国象棋
- 编译原理课程设计-C语言子集编译器
- 用贪心算法实现会场安排问题
- 操作系统课程设计(银行家算法)附
- 用c写的航空订票系统 航班信息改变
- 信息论课程设计——LZW编码
- 人员管理系统 c语言源码 课程设计专
- MFC课程设计学生管理系统
- vc++课程设计 让计算机来猜测用户“暗
评论
共有 条评论