文章

327

粉丝

40

获赞

2

访问

40.2k

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

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)信号量定义及初值(满分2分)

学生定义了两个信号量a_done和c_done,初值均为0,符合同步需求。但标准答案中需要控制C在A和B完成后执行,而学生仅通过a_done控制A完成,缺少对B完成的同步(B无前置,但C需要等待A和B都完成)。此处信号量数量不足,未能完全覆盖所有跨线程同步关系(缺少对B的等待)。扣1分。

得分:1分

(2)线程T1同步操作(满分3分)

T1中:A执行后signal(a_done)正确;但E执行前wait(c_done)正确(等待C完成);F执行无需等待(因为F仅依赖E,且E和F在同一线程,无需信号量)。但问题在于,学生方案中C的完成信号(c_done)由T2发送,但T2中C执行后立即signal(c_done),而C需要等待A和B完成,但学生代码中T2的wait(a_done)只等待了A完成,未等待B完成(B执行后无信号量同步),导致C可能在B未完成时执行,违反约束。逻辑错误,扣2分。

得分:1分

(3)线程T2同步操作(满分3分)

T2中:B执行后无信号量操作(正确,因为B无前置);wait(a_done)等待A完成(正确);但C执行前缺少对B完成的等待(B虽在同一线程,但B和C是顺序执行,理论上无需额外信号量,但问题在于T2中B和C是顺序执行,所以B完成后自然会执行C,但学生代码中T2的wait(a_done)在B之后,这意味着C必须等待A完成,但B是否完成不影响?实际上,由于B和C在同一线程,B执行完成后才会执行wait(a_done)和C,所以B的完成已保证。但标准约束要求C必须等待A和B都完成,而学生代码中通过wait(a_done)等待了A,通过线程内顺序保证了B完成(因为B在C之前),因此对于C的启动,实际上等待了A(跨线程)和B(线...

登录查看完整内容


登录后发布评论

暂无评论,来抢沙发