文章
397
粉丝
40
获赞
2
访问
90.3k
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分
理由:学生使用了奇偶编号差异化的筷子获取顺序(奇数先右后左,偶数先左后右),这是一种有效的死锁避免策略,思路正确且与标准答案等效,不扣分。但存在两处细节错误:1)在P操作使用chopsticks[(i+1)%n]时缺少右括号(语法错误);2)在筷子索引计算中,i%n是冗余的(因为i本身就在0到n-1范围内),但不会引起逻辑错误。扣1分(主要针对语法错误,因为考试中代码细节准确性需要扣分)。
题目总分:2+5=7分
(注:原题总分8分,分解为信号量定义2分+进程逻辑6分)
登录后发布评论
暂无评论,来抢沙发