用记录型信号量解决哲学家进餐问题

来源:百度知道 编辑:UC知道 时间:2024/06/22 08:58:58
程序如下:
void Task (void *pdata)
{
INT8U err;
INT8U * j = (INT8U*)pdata;//哲学家编号
for (;;) {
OSSemPend(Sem_chopstick[*j], 0, &err); /* 拿起左边一支筷子 */
OSSemPend(Sem_chopstick[((*j) + 1) % N_TASKS], 0, &err);/* 拿起右边一支筷子 */
sprintf(s,"dinner %d eat!",(*j));
PC_DispStr(x, y++, s, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
OSTimeDly(1000); //延时

OSSemPost(Sem_chopstick[(*j)]); /* 放下左边一支筷子 */
OSSemPost(Sem_chopstick[((*j) + 1) % N_TASKS]); /* 放下右边一支筷子 */
sprintf(s,"dinner %d think!",(*j));
PC_DispStr(x, y++, s, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
OSTimeDly(1000); //延时
}
}
运行结果如下:
dinner 0 eat
dinner 0 think
dinner 1 eat
dinner 0 eat
dinner 1 th
dinner 0 th
dinner 1 eat
dinner 0 eat
...
//////////////////////////////////////////////////
可见结果是不正确的.
并没有使并行进程串行化
运行结果的第四行dinner 0 eat在dinner 1 e

27.试利用记录型信号量写出一个丌会出现死锁的哲学家迚餐问题的算法. 答:Var chopstick:array[0,„,4] of semaphore;
所有信号量均被初始化为1,第i 位哲学家的活动可描述为: Repeat
Wait(chopstick[i]);
Wait(. chopstick[(i+1) mod 5]); „ Ea.t „
Signal(chopstick[i]);
Signal(chopstick[(i+1) mod 5]) Ea.t „ Think; 11
Until false;