文章
27
粉丝
12
获赞
0
访问
872
semaphore mutex = 1; // 取号机互斥 semaphore empty = 10; // 空座位数 semaphore full = 0; // 等待服务的顾客数 semaphore queue_mutex = 1; // 等待队列的互斥(入队/出队操作) cobegin process 顾客i { P(empty); // ① 申请空座位:无空座位则阻塞,有空则占用(empty减1) P(mutex); // ② 申请取号机:互斥访问取号机 从取号机获得一个号码; V(mutex); // ③ 释放取号机:允许其他顾客取号 P(queue_mutex); // ④ 申请队列互斥:准备加入等待队列 将自己加入等待队列; // (逻辑操作,需互斥保护队列) V(queue_mutex); // ⑤ 释放队列互斥 V(full); // ⑥ 通知营业员:等待服务的顾客数加1 等待叫号; // (在队列中等待,由营业员出队触发) 获得服务; } process 营业员 { while (TRUE) { P(full); // ① 等待顾客:无等待顾客则阻塞,有则继续(full减1) P(queue_mutex); // ② 申请队列互斥:准备取出顾客 从等待队列中取出一个顾客(叫号); V(queue_mutex); // ③ 释放队列互斥 为顾客服务; V(empty); // ④ 释放座位:服务完成,空座位数加1 } } coend
评分及理由
(1)信号量定义及初值(满分2分)
得分:2分
理由:学生正确定义了所有必要的信号量(mutex、empty、full、queue_mutex),并赋予了合理的初值。与标准答案相比,虽然命名略有不同(如queue_mutex代替了mutex),但功能完全一致,符合题目要求。
(2)顾客进程实现(满分3分)
得分:3分
理由:顾客进程的逻辑完全正确,包括:申请空座位(P(empty))、互斥访问取号机(P(mutex)/V(mutex))、加入等待队列(P(queue_mutex)/V(queue_mutex))、通知营业员(V(full))以及等待叫号的逻辑。虽然未显式实现"等待叫号"的同步信号量(如标准答案的service_i),但通过队列操作隐式实现了同步,思路正确且功能等价。
(3)营业...
登录后发布评论
暂无评论,来抢沙发