文章
14
粉丝
0
获赞
0
访问
503
mutex=1;empty=N;full=0;even=0;odd=0;
mutex表示互斥访问的信号量;empty表示初始缓冲区空单元数目;full表示初始缓冲区数的个数;even表示初始缓冲区偶数的个数;odd表示初始缓冲区奇数的个数;
P1(){
while(true){
P(empty);
int num = produce();
P(mutex);
put();
V(mutex);
if(num%2==0){
V(even);
}else{
V(odd);
}
V(full);
}
}
P2(){
while(true){
P(full);
P(odd);
P(mutex);
getodd();
V(mutex);
V(empty);
countodd();
}
}
P3(){
while(true){
P(full);
P(even);
P(mutex);
geteven();
V(mutex);
V(empty);
counteven();
}
}
评分及理由
(1)信号量定义(满分2分)
得分:1分
理由:学生定义了mutex、empty、even、odd四个必要的信号量,但额外定义了full信号量。虽然full信号量在生产者-消费者问题中常见,但在此题中与标准答案不一致,且可能引起同步逻辑问题。由于信号量定义基本正确但有多余定义,扣1分。
(2)同步互斥逻辑(满分4分)
得分:2分
理由:学生代码存在以下逻辑错误:
1. P1进程中V(full)的位置错误,应该在put操作前或后立即执行,但学生放在了条件判断之后,这会导致同步时序问题
2. P2和P3进程中P(full)和P(odd)/P(even)的顺序错误,可能导致死锁或数据不一致
3. 缺少对缓冲区空单元的准确控制,P2和P3中只V(empty)一次,但P1中P(empty)一次,逻辑不匹配
这些逻辑错误严重影响程序正确性,扣2分
(3)代码完整性(满分1分)
得分:1分
理由:学生代码结构完整,包含了所有必要的进程和基本操作,代码格式规范。
题目总分:1+2+1=4分
登录后发布评论
暂无评论,来抢沙发