文章

327

粉丝

40

获赞

2

访问

40.2k

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

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完成和操作C完成,初值均为0,符合同步需求。但存在逻辑错误:

  • 操作C需要等待A和B都完成,但学生代码中T2的C执行前只等待了a_done(即A完成),没有等待B完成(B在T2中与C同线程,但B执行后没有同步机制确保B先于C执行)。虽然B和C在同一线程,执行顺序自然保证,但题目要求C必须在A和B都完成后执行,而学生代码中T2的wait(a_done)后直接执行C,此时B确实已执行(因为B在wait前),因此这一部分实际上正确。
  • 操作E需要等待C完成,学生使用wait(c_done)实现,正确。
  • 操作D需要等待C完成,但学生代码中D在T2中直接跟在C后执行,自然保证,正确。
  • 操作F需要等待E完成,但学生代码中F在T1中直接跟在E后执行,自然保证,正确。

然而,学生代码有一个关键问题:T1中E执行前等待c_done,但T2中C执行后signal(c_done),这正确同步了E和C。但操作C的执行需要同时等待A和B,学生代码通过wait(a_done)确保A完成(因为B在同一线程已执行),所以实际上同步关系正确。但标准答案中考虑了跨线程同步(A和C、C和E),学生也正确实现了这两点。

但学生代码简化过度:标准答案中强调跨线程同步需要信号量,而线程内同步可省略。学生只用了两个信号量(a_done和c_done),与标准答案的简化版本一致(S_AC和S_CE),且初值正确。因此逻辑正确,无错误。

但学生代码中CoBegin和CoEnd的写法不标准(应为cobegin和coend),但属于语法细节,不扣分。

因此,学生答案正确,得满分8分。

题目总分:8分

登录查看完整内容


登录后发布评论

暂无评论,来抢沙发