文章
24
粉丝
253
获赞
1
访问
14.6k
semaphore mutex=1;
semaphore full=0;
semaphore empty=N;
p1(){
while(1){
x=produce();
p(empty);
p(mutex);
put();
v(mutex);
v(full);
}
}
p2(){
while(1){
p(full);
p(mutex);
int k=getodd();
if(k%2!=0){
countodd();
v(mutex);
v(empty);
}
}
}
p3(){
while(1){
p(full);
p(mutex);
int m=geteven();
if(m%2==0){
geteven();
v(mutex);
v(empty);
}
}
}
评分及理由
(1)信号量定义得分及理由(满分1分)
得分:0.5分
理由:学生定义了mutex、full、empty三个信号量,缺少区分奇偶数的同步信号量。虽然full可以用于生产者消费者同步,但无法区分奇偶数,这会导致P2和P3无法正确获取对应类型的数据。
(2)P1进程实现得分及理由(满分2分)
得分:1.5分
理由:P1的生产者逻辑基本正确,有empty和mutex的正确使用。但缺少对数据奇偶性的判断和相应的信号量操作(V(odd)或V(even)),这会导致后续消费者无法区分数据类型。
(3)P2进程实现得分及理由(满分2分)
得分:1分
理由:存在严重逻辑错误:①在获取数据后先判断奇偶性再释放互斥锁,这违背了互斥原则;②getodd()操作应该在判断奇偶性之前完成;③countodd()不应该在互斥区内执行;④缺少对获取数据是否为奇数的正确判断逻辑。
(4)P3进程实现得分及理由(满分2分)
得分:0.5分
理由:存在严重逻辑错误:①调用了两次geteven()...
登录后发布评论
暂无评论,来抢沙发