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

程序如下:
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 eat之后,dinner 1 think之前(信号量还没有被释放),就能出现.这是不可能的.
请问各位大虾.这是怎么会事.用记录型信号量怎么解决哲学家进餐问题.

第1个回答  2013-09-12
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;
相似回答