文章

281

粉丝

40

获赞

2

访问

23.7k

头像
2022年计算机学科专业基础综合试题 - 第46题回答
操作系统
发布于2025年9月20日 23:52
阅读数 84

CoBegin{
semaphore a_done = 0;//操作A完成
semaphore c_done = 0;//操作C完成


T1(){

A执行完成;
signal(a_done);
wait(c_done);
E执行完成;
F执行完成;
}

T2(){
B执行完成;
wait(a_done);
C执行完成;
signal(c_done);
D执行完成;
}

}
CoEnd

 


评分及理由

(1)得分及理由(满分8分)

学生使用信号量a_done和c_done来实现同步,基本思路正确:a_done用于表示操作A完成(对应A和C的同步),c_done用于表示操作C完成(对应C和E的同步)。但存在以下问题:

  • 操作B没有同步约束:标准答案中,操作C需要等待A和B都完成,但学生的代码中,T2线程在wait(a_done)后直接执行C,缺少对操作B完成的等待(即B和C的同步)。虽然操作B和C在同一线程T2中,但题目要求C必须在A和B完成后执行,而B和C在同一个线程,理论上顺序执行可以保证B先于C,但题目没有明确说明线程内部操作是否允许重排序,从严格同步角度,标准答案考虑了跨线程的同步(A和C),而同一线程的B和C依赖线程顺序执行。但学生的代码中,T2的wait(a_done)在B执行之后,这实际上保证了C在A和B之后(因为B在wait之前执行),所以这里逻辑正确,不扣分。
  • 操作D和F的同步缺失:操作D需要在C完成后执行,但D和C在同一线程T2中,顺序执行可保证,因此不需要额外信号量;操作F需要在E完成后执行,但E和F在同一线程T1中,顺序执行可保证,因此也不需要额外信号量。所以这里正确,不扣分。
  • 信号量初值:a_done和c_done初值均为0,正确。
  • 代码结构:使用了CoBegin和CoEnd,正确。

但学生代码有一个关键错误:在T1中,E执行前wait(c_done),但T2中C执行后signal(c_done)。这正确实现了C和E的同步。然而,操作E和F之间没有信号量,但由于在同一线程,顺序执行保证E在F前,正确。

总体来看,学生的同步设计正确且简化合理(只使用了两个信号量),与标准答案的简化版本一致。因此得满分8分。

题目总分:8分

登录查看完整内容


登录后发布评论

暂无评论,来抢沙发