文章
317
粉丝
1
获赞
220
访问
83.2k

评分及理由
(1)得分及理由(满分2分)
得分:2分
理由:学生答案正确指出实现C1的代码是临界区,并给出了合理的解释:因为B是共享资源,对B的写入操作需要互斥访问以防止数据不一致。这与标准答案的核心观点一致。
(2)得分及理由(满分3分)
得分:2分
理由:学生答案定义了正确的信号量(mutex, full, empty)并设置了合理的初值(mutex=1, full=0, empty=N)。同步逻辑基本正确:P1先申请空位(wait(empty)),再申请互斥访问(wait(mutex)),执行C1后释放互斥锁并增加数据计数(signal(mutex); signal(full))。P2先等待有数据(wait(full)),再申请互斥访问,执行C2后释放互斥锁并增加空位计数(signal(mutex); signal(empty))。
扣分原因:标准答案中只要求定义“尽可能少的信号量”,并只针对P1执行C1一次、P2执行C2一次的场景。标准答案使用了两个信号量(mutex和full)。学生答案使用了三个信号量(mutex, full, empty),虽然逻辑正确,但未满足“尽可能少”的要求(empty信号量在此特定的一次性执行场景中是冗余的)。因此扣1分。
(3)得分及理由(满分3分)
得分:1分
理由:学生答案正确地定义了互斥信号量mutex并设置了初值1,用于保护对缓冲区B的互斥访问,这是正确的核心思想。
扣分原因:存在多处逻辑错误和冗余。
1. 题目要求“B初始不为空,进程P1和P2各执行C3一次”,C3是修改操作,只需要互斥,不需要同步条件(因为B始终非空)。学生答案中定义了full和empty信号量,这是完全多余的,不符合“尽可能少的信号量”要求。
2. 在进程代码中使用了`if(full > 0)`的条件判断。使用信号量进行同步时,应使用`wait/signal`原语来阻塞/唤醒进程,而不是用`if`语句进行条件判断,`if`语句无法保证在并发环境下的正确性。
3. 在P1的代码中出现了“P1(put)”和“执行C3一次”的混淆,逻辑不清。在P2的代码中(第二次识别结果)误写为“执行C4一次”,应为C3。
由于存在严重的逻辑错误(错误使用if判断和非必要的信号量),扣2分。
题目总分:2+2+1=5分
登录后发布评论
暂无评论,来抢沙发