文章
50
粉丝
0
获赞
0
访问
2.4k
semaphore me=1;//用于实现缓冲区互斥使用
semaphore empty=N;//用于记录缓冲区空白单元
int j=0;//用于记录奇数个数
int o=0;//用于记录偶数个数
int n;//用于记录生成的数
P1{
while(1){
P(N)
P(me)
n=produce()
if(n%2==0){
o++;
}else{
j++;
}
put()
V(me)
}
}
P2{
while(1){
if(j>0){
P(me);
getodd();
countodd();
j--;
V(empty);
V(me);
}
}
}
P3{
while(1){
if(o>0){
P(me);
geteven();
counteven();
o--;
V(empty);
V(me);
}
}
}
评分及理由
(1)信号量定义及含义(满分2分)
得分:1分。理由:学生定义了互斥信号量me(相当于mutex)和同步信号量empty(用于记录空白单元),这符合要求。但是缺少专门用于P1与P2(奇数)和P1与P3(偶数)之间同步的信号量(如odd和even),只使用了j和o变量来记录个数,但变量无法实现进程同步(例如当j=0时P2无法阻塞等待)。因此扣1分。
(2)同步与互斥实现(满分4分)
得分:1分。理由:学生使用了P(empty)和P(me)/V(me)来实现缓冲区的互斥访问和空单元同步,这部分正确。但P2和P3中使用if判断j>0和o>0而不是信号量等待,这会导致忙等待(不符合信号量同步机制),且无法保证P2/P3在无奇数/偶数时阻塞。另外,P1中V(empty)的位置错误(应该在消费者中释放,但学生写在了P1的P(empty)之后,实际上P1中缺少V(empty)的释放,而P2/P3中正确释放了V(empt...
登录后发布评论
暂无评论,来抢沙发