文章
145
粉丝
0
获赞
0
访问
8.2k

评分及理由
(1)得分及理由(满分8分)
学生作答整体思路是使用一个互斥锁(lock)来保护对共享资源(碗和筷子)的检查和修改,并尝试在满足条件时获取资源。然而,该方案存在多处逻辑错误和安全隐患:
Wan > 1 意味着只有当碗的数量大于1时哲学家才能尝试进餐。这与题目中“有m(m≥1)个碗”的条件不符,且当m=1时,任何哲学家都无法进餐,不合理。k[i] 的初始化和使用混乱。第一次识别中初始化为0,第二次识别中初始化为1。根据常理,可用资源信号量初值应为正数。在检查条件时使用 k[i-1] == 1 和 k[i%n] == 1,意味着筷子可用时值为1。但在获取资源时,对 k[i-1] 和 k[i%n] 进行减减操作。这里存在严重的数组索引问题:对于哲学家i,其左手筷子应为 i(或 i-1 需处理边界),右手筷子应为 (i+1)%n。学生的代码中 k[i-1] 和 k[i%n] 不能正确表示左右筷子,且当i=0时,i-1 会导致数组下标越界。v(lock); break; 跳出循环。但跳出循环后,代码流程会执行到while循环外的 v(lock);(第一次识别版本)或直接到“吃饭”部分(第二次识别版本)。第一次识别版本在获取资源后多执行了一次 v(lock),第二次识别版本逻辑稍好,但整体结构依然混乱。
登录后发布评论
暂无评论,来抢沙发