文章
327
粉丝
40
获赞
2
访问
40.2k
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(线...
登录后发布评论
暂无评论,来抢沙发