文章
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)得分及理由(满分8分)
学生使用了两个信号量a_done和c_done,分别表示操作A完成和操作C完成,初值均为0,符合同步需求。但存在逻辑错误:
然而,学生代码有一个关键问题: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分
登录后发布评论
暂无评论,来抢沙发