文章
62
粉丝
0
获赞
0
访问
9.8k
// 限制碗的数量至多为n-1
semaphore bowl = min(m, n - 1);
semaphore chopstick[n] = {1,1,1...}
void Eat(int i)
{
do {
P(&bowl); // 拿到碗的至多n-1人
P(&chopstick[i])
P(&chopstick[(i+1) % n])
进餐();
V(&chopstick[i])
V(&chopstick[(i+1) % n])
V(&bowl);
思考();
} while(1);
}
评分及理由
(1)信号量定义部分(满分2分)
学生正确定义了碗的信号量bowl,初值为min(m, n-1),与标准答案一致。同时正确定义了筷子信号量数组chopstick[n]并初始化为1。该部分完整正确,得2分。
(2)哲学家进程逻辑部分(满分6分)
学生代码逻辑与标准答案基本一致:先申请碗,再依次申请左右筷子,就餐后按相反顺序释放资源。但存在两个问题:
1. 缺少思考操作的位置:在循环开始前应该先思考,而学生将思考放在释放资源后,这与题目要求的"交替地就餐和思考"逻辑顺序不符,扣1分
2. 语法细节:使用了P(&bowl)等带地址符的写法,这不是标准的P/V操作表示法,但考虑到语义正确,扣0.5分
该部分得分为6-1-0.5=4.5分
题目总分:2+4.5=6.5分
登录后发布评论
暂无评论,来抢沙发