文章
101
粉丝
0
获赞
1
访问
30.2k
Semaphore emptyA=0;//信箱是否为空
Semaphore emptyB=0;
Semaphore muteA=1;
Semaphore muteB=1;
Semaphore fullA=M;//信箱内是否满
Semaphore fullB=N;
CoBegin
A{
while(true){
p(emptyA);
v(fullA);
p(muteA);
取邮件;
v(muteA);
回答并提出问题;
p(fullB);
p(muteB);
放进B信箱;
v(emptyB);
v(muteB);
}
B{
while(true){
p(emptyB);
p(muteB);
取邮件;
v(muteB);
回答问题并提出新问题;
p(fullA);
p(muteA);
将习邮件放入A信箱;
v(emptyA);
v(muteA);
}
评分及理由
(1)信号量定义及初值(满分2分)
得分:0分
理由:学生定义的信号量含义和初值存在严重错误。emptyA和emptyB初值为0,但实际应表示信箱空位数量,初值应为Empty_A=M-x和Empty_B=N-y;fullA和fullB初值为M和N,但实际应表示信箱中邮件数量,初值应为Full_A=x和Full_B=y。信号量含义与标准答案完全不符。
(2)A进程同步互斥操作(满分3.5分)
得分:0.5分
理由:A进程中使用了互斥信号量muteA保护取邮件操作,这是正确的(得0.5分)。但同步逻辑完全错误:在取邮件前应该P(Full_A)检查是否有邮件,而不是P(emptyA);应该V(Empty_A)释放空位,而不是V(fullA)。放入B信箱时的同步操作也完全错误。
(3)B进程同步互斥操作(满分3.5分)
得分:1分
理由:B进程中使用了互斥信号量muteB保护取邮件操作(得0.5分),放入A信箱时也使用了互斥信号量muteA(得0.5分)。但同步逻辑同样完全错误:取邮件前应该P(Full_B)而不是P(emptyB);放入A信箱时应该P(Empty_A)检查空位而不是P(fu...
登录后发布评论
暂无评论,来抢沙发