文章
21
粉丝
0
获赞
0
访问
2.0k
1.是,因为需要对缓冲区B进行互斥写
2.
sem empty_b=1;
sem fill_b = 0;
sem lock_b =1;// 理论上由于这里只需要各执行一次,且仅存在P1,P2两个进程,其互斥性已由empty_b和fill_b保证,但一般性的,我们仍然为B加锁
buf B;
void P1(){
wait(empty_b);
wait(lock_b);
C1(B);
signal(lock_b);
signal(fill_b);//若需要执行多次,外面套while即可
}
void P2(){
wait(fill_b);
wait(lock_b);
C2(B);
signal(lock_b);
signal(empty_b);//若需要执行多次,外面套while即可
}
3.
sem lock_b =1;
sem nonempty_b = N;//不为空,N!=0
buf B;
void P1(){
wait(nonempty_b);
wait(lock_b);
C3(B);
signal(lock_b);
signal(nonempty_b);//C3不取出数据,恢复信号量
}
void P2(){
wait(nonempty_b);
wait(lock_b);
C3(B);
signal(lock_b);
signal(nonempty_b);//C3不取出数据,恢复信号量
}
评分及理由
(1)得分及理由(满分2分)
学生回答“是,因为需要对缓冲区B进行互斥写”,正确指出了C1操作需要互斥访问缓冲区B,且理由充分。与标准答案一致。得2分。
(2)得分及理由(满分3分)
学生定义了三个信号量(empty_b、fill_b、lock_b),但题目要求“定义尽可能少的信号量”。实际上,互斥锁lock_b是多余的,因为empty_b和fill_b已经隐含了同步和互斥(在单缓冲区情况下,同步信号量可保证互斥)。标准答案仅使用两个信号量(mutex和full)。学生代码逻辑正确,但多定义了一个不必要的信号量,且未说明信...
登录后发布评论
暂无评论,来抢沙发