目录
1. 设计题目与要求 ??????????????????? 2
设计目的 设计要求
2. 总体设计思想与相关知识 ??????????????? 2
总体设计思想 问题描述 解决方案
3. 数据结构、流程图 ?????????????????? 2
数据结构 流程图
4.
源代码 ???????????????????????
.3
5. 运行结果 ??????????????????????
.6
6. 结果分析 ??????????????????????
.7
7. 总结及心得体会 ???????????????????
.7
1. 设计题目与要求
设计目的
掌握进程同步问题的解决思路及方法, 熟练使用 Windows操作系统提供的信号量机 制解决各种进程同步问题。
设计要求
设有五个哲学家 , 共用一张放有五把椅子的餐桌 , 每人坐在一把椅子上 ,桌子上有五 个碗和五只筷子 , 每人两边各放一只筷子。 哲学家们是交替思考和进餐 , 饥饿时便试图取 其左右最靠近他的筷子。条件 :
(1) 只有拿到两只筷子时 , 哲学家才能吃饭。
(2) 如果筷子已被别人拿走 , 则必须等别人吃完之后才能拿到筷子。
(3) 任意一个哲学家在自己未拿到两只筷子吃饭前 , 不会放下手中拿到的筷子。
2.总体设计思想与相关知识
总体设计思想
哲学家的生活就是思考和吃饭,即思考,饿了就餐,再思考,循环往复。要求是: 每一个哲学家只有在拿到位于他左右的筷子后,才能够就餐;哲学家只能先拿左边的筷 子,再去拿右边的筷子,而不能同时去抓他两边的筷子,也不能从其他哲学家手中抢夺 筷子;哲学家每次就餐后必须放下他手中的两把筷子后恢复思考, 不能强抓住餐具不放。
设计一个程序,能够显示当前各哲学家的状态和桌上餐具的使用情况,并能无死锁 的推算出下一状态各哲学家的状态和桌上餐具的使用情况。 即设计一个能安排哲学家正 常生活的程序。
问题描述 可能出现死锁问题,因为当五个哲学家都饥饿时,都拿着一支筷子,这样就可
能五 个哲学家都用不上餐。
解决方案
最多允许 4 个哲学家同时坐在桌子周围。
给所有哲学家编号,奇数号的哲学家必须首先拿左边的筷子,偶数号的哲学家则 反之。 为了避免死锁,把哲学家分为三种状态,思考,饥饿,进食,仅当一个哲学家左 右两边的筷子
都可用时,才允许他拿筷子,并且一次拿到两只筷子,否则不拿。 3.数据结构及流程图
数据结构
philosopherProc +myid:int +mystate:int +philosopherProc(LPVOIDlpParameter) +ResumeThread(hPhilosopher[i]):int +strcpy(stateStr, \ 程序中定义一个哲学家类,包含两个私有对象和四个公有对象。
myid 对象:报讯哲学家的编号。
mystate 对象:用于保存当前该哲学家的状态,
philosopherProc( LPVOID lpParameter) 方法:哲学家类构造函数, PHILOSOPHER_NUM 表示哲学家
编号
ResumeThread(hPhilosopher[i]) 方法:返回该哲学家编号 strcpy(stateStr, \方法:返回哲学家当前状
态
根据题目要求改变哲学家的状态(饥饿 -> 进餐-> 思考->饥饿????)
流程图
4. 源代码 (c++)
.... \
ReleaseMutex(mutex);
mystate = THINKING; //
THINKING
leftFork = (myid) % PHILOSOPHER_NUM; rightFork = (myid + 1) % PHILOSOPHER_NUM;
while (true) {
switch(mystate)
{ case THINKING:
mystate = HUNGRY; // strcpy(stateStr, \
break;
case HUNGRY:
strcpy(stateStr, \
ret = WaitForSingleObject(semaphore[leftFork], 0); // 可用 if (ret == WAIT_OBJECT_0)
{
ret = WaitForSingleObject(semaphore[rightFork], 0); // 再检查右筷子是否可用
if (ret == WAIT_OBJECT_0)
{
mystate = DINING; // 变自己的状态 strcpy(stateStr, \
} else {
ReleaseSemaphore(semaphore[leftFork], 1, NULL); // 用,就把左筷子放下 }
} break; case DINING:
// 吃完后把两支筷子都放下
ReleaseSemaphore(semaphore[leftFork], 1, NULL); ReleaseSemaphore(semaphore[rightFork], 1, NULL); mystate = THINKING; // strcpy(stateStr, \
break;
初始状态为
改变状态
先检查左筷子是否
左筷子可用就拿起,
右筷子可用,就改
如果右筷子不可
改变自己的状态
// 输出状态
WaitForSingleObject(mutex, INFINITE);
cout << \ReleaseMutex(mutex);
// sleep a random time : between 1 - 5 s int sleepTime;
sleepTime = 1 + (int)*rand()/(RAND_MAX+); 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(NULL,0,philosopherProc,LPVOID(i), CREATE_SUSPENDED,0); }
for (i=0; i
ResumeThread(hPhilosopher[i]); Sleep(2000); return 0;
}
5. 运行结果
相关推荐: