文章
397
粉丝
40
获赞
2
访问
88.6k
semaphore bowls = min(m,n-1); // 所有碗资源的信号量
semaphore chopsticks[n]; // 所有筷子资源的信号量
for(int i = 1;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]);
}
if(i%2 == 0){
p(chopsticks[i%n]);
p(chopsticks[(i+1)%n]);
}
吃饭;
v(chopsticks[(i+1)%n]);
v(chopsticks[i%n]);
v(bowls);
}
}CoEnd
评分及理由
(1)信号量定义及初始化部分(满分2分)
得分:2分
理由:学生正确定义了bowls信号量,初值为min(m, n-1),符合标准答案要求;同时正确定义了chopsticks数组并初始化所有元素为1。但注意代码中数组索引从1开始(for循环i从1到n),而标准答案通常从0开始,但逻辑上正确(因为取模运算会处理索引),故不扣分。
(2)哲学家进程中的资源请求顺序(满分4分)
得分:3分
理由:学生采用了奇偶编号区分筷子请求顺序(奇数先右后左,偶数先左后右),这是一种常见的死锁避免策略(与标准答案不同但正确),因此思路正确不扣分。但存在以下逻辑错误:
- 在P操作取筷子时,使用了`(i+1)%n`和`i%n`,但注意i的取值:若哲学家编号从1开始,则i%n可能为0(当i=n时),而0索引是有效的,但通常哲学家编号从0到n-1更常见。这里索引处理存在潜在问题(例如当i=n时,i%n=0,而chopsticks索引从1到n,因此索引0未初始化),这会导致错误。扣1分。
- 另外,代码中使用了两个if分支,但未用else连接,若第一个if条件满足(i为奇数),执行后还会检查第二个if条件(i为偶数),但由于i不可能同时...
登录后发布评论
暂无评论,来抢沙发