文章
5
粉丝
0
获赞
0
访问
344
semaphore mutex = 1; // 互斥信号量
semaphore empty = N;
semaphore full = 0;
semaphore odd = 0;
semaphore even = 0;
P1{
while(1){
int num = produce();
if (num %2==0){
v(even);
}else{
v(odd);
}
// 访问临界区
p(full);
p(mutex);
put(num);
v(mutex);
v(full);
}
}
P2{
while(1){
p(odd);
p(mutex);
getodd();
countodd()++;
v(mutex);
}
}
P2{
while(1){
p(even);
p(mutex);
geteven();
counteven()++;
v(mutex);
}
}
评分及理由
(1)信号量定义得分及理由(满分1分)
得分:1分
理由:学生定义了mutex、empty、odd、even信号量,与标准答案一致。虽然额外定义了full信号量,但根据"禁止加分"原则,不扣分也不加分。
(2)P1进程实现得分及理由(满分2分)
得分:0分
理由:存在严重逻辑错误:①先V(odd)/V(even)后执行put操作,导致消费者可能在数据还未放入缓冲区时就收到信号;②P(full)和V(full)使用错误,full信号量应该用于控制缓冲区非空,但这里使用方式完全错误;③缺少P(empty)操作来检查缓冲区空位;④V(full)应该在put之后,但这里V(full)的位置和意义都不对。
(3)P2/P3进程实现得分及理由(满分4分)
得分:1分
理由:①P2和P3的代码结构基本正确,使用了正确的信号量等待和互斥保护;②但存在严重错误:缺少V(empty)操作来释放缓冲区空间;③代码中有"P2{"重复定义的笔误;④countodd()++和counteven()++的语法错误,应该是函数调用。
题目...
登录后发布评论
暂无评论,来抢沙发