文章
54
粉丝
21
获赞
0
访问
4.1k
semaphore buffet=N; //剩余可用单元数
semaphore even=0;//缓冲区中剩余偶数个数
semaphore odd=0;//缓冲区中剩余奇数个数
P1{while{
P(buffet);
if(produce()%2==0){
V(even);
}else{
V(odd);
}
put();
}
}
P2{while{
P(odd);
取出一个奇数;
countodd();
V(buffet);
}
}
P3{while{
P(even);
从缓冲区中取出一个偶数;
counteven();
V(buffet);
}
}
评分及理由
(1)信号量定义得分及理由(满分2分)
得分:1分
理由:学生定义了buffet(应为empty)、even、odd三个信号量,基本覆盖了同步需求,但缺少互斥信号量mutex。buffet拼写错误但不影响理解。由于缺少关键互斥信号量,扣1分。
(2)P1进程实现得分及理由(满分2分)
得分:0分
理由:存在严重逻辑错误:①先进行P(buffet)后直接判断produce()的奇偶性,但此时还未实际将数据放入缓冲区;②V(even)/V(odd)操作在put()之前执行,这会导致消费者可能在数据还未放入缓冲区时就被唤醒;③缺少互斥保护。这些都属于严重逻辑错误。
(3)P2/P3进程实现得分及理由(满分3分)
得分:1分
理由:P2和P3的基本同步逻辑正确(通过P(odd)/P(even)等待相应数据,通过V(buffet)释放空间),但存在以下问题:①缺少互斥保护;②"取出一个奇数/偶数"的操作没有明确的缓冲区访问机制;③计数操作countodd()/counteven()的位置基本合理。由于缺少互斥保护这一关键问题,扣2分。
题目总分:1+0+1=2分
登录后发布评论
暂无评论,来抢沙发