文章
294
粉丝
40
获赞
2
访问
28.6k
semaphore bowls = min(m,n-1); // 可进餐人数
semaphore chopsticks[n]; // 所有筷子资源的信号量
for(int i = 0;i < n; i++){
chopsticks[i] = 1; //对所有筷子的信号量置1
}
CoBegin{
process_i(){
思考;
p(bowls);//吃完前先取碗
if(i%2 == 1){
p(chopsticks[(i+1)%n]);
p(chopsticks[i%n]);
}else{
p(chopsticks[i%n]);
p(chopsticks[(i+1)%n]);
}
吃饭;
v(chopsticks[i%n]);
v(chopsticks[(i+1)%n]);
v(bowls);
}
}CoEnd
评分及理由
(1)信号量定义及初始化部分(满分2分)
得分:2分
理由:学生正确定义了bowls信号量(初值为min(m, n-1))和chopsticks数组信号量(每个初值为1),与标准答案一致,完全正确。
(2)哲学家进程实现部分(满分6分)
得分:5分
理由:学生使用了奇偶编号区分拿筷子的顺序(奇数先右后左,偶数先左后右),这是一种常见的死锁避免策略(与标准答案的对称性破坏方法等效),思路正确且能防止死锁。但存在两处细节错误:
p(chopsticks[(i+1)%n]);
(先取右边)然后p(chopsticks[i%n]);
(后取左边),但i%n实际上就是i(因为i的范围是0到n-1),这里应直接使用i而不是i%n(虽然结果相同,但多余操作)。不过这不是逻辑错误,不扣分。chopsticks[i%n]
(左边)再释放chopsticks[(i+1)%n]
(右边),但无论奇偶编号,释放顺序都应与获取顺序相反(否则可能引发问题,但这里实际影响不大)。严格来说,释放顺序应该对称(但标准答案也未要求),这里轻微逻辑不严谨,扣1分。题目总分:2+5=7分
登录后发布评论
暂无评论,来抢沙发