实现一个银行系统该银行设置有M个窗口。每个用户需要先取号只有一台取号机。用户分为对公用户私人用户。私人用户又分为普通用户VIP用户。其中窗口的柜员在服务时按优先级给用户服务其中对公用户的优先级最高VIP用户次之普通用户优先级最低。请使用P、V操作及信号量的伪代码实现
定义信号量:
Semaphore mutex = 1; // 互斥信号量 Semaphore publicQueue = 0; // 对公用户队列信号量 Semaphore vipQueue = 0; // VIP用户队列信号量 Semaphore ordinaryQueue = 0; // 普通用户队列信号量 Semaphore takeNumber = 1; // 取号机信号量
定义变量:
int publicNum = 0; // 对公用户号码 int vipNum = 0; // VIP用户号码 int ordinaryNum = 0; // 普通用户号码
取号机线程:
Thread takeNumberThread() { while(true) { P(takeNumber); // 等待取号机可用 P(mutex); // 进入临界区 int num = 0; if(publicNum == 0 && vipNum == 0 && ordinaryNum == 0) { // 没有用户等待,取号机休眠 V(mutex); // 退出临界区 V(takeNumber); // 释放取号机 sleep(1); // 休眠1秒 continue; } if(publicNum != 0) { num = publicNum; publicNum = 0; } else if(vipNum != 0) { num = vipNum; vipNum = 0; } else if(ordinaryNum != 0) { num = ordinaryNum; ordinaryNum = 0; } V(mutex); // 退出临界区 if(num != 0) { // 打印用户号码 print("取到号码:" + num); // 唤醒等待该号码的用户线程 if(num < 100) { V(publicQueue); } else if(num < 1000) { V(vipQueue); } else { V(ordinaryQueue); } } } }
对公用户线程:
Thread publicThread() { int num = 0; P(mutex); // 进入临界区 publicNum++; num = publicNum; V(mutex); // 退出临界区 print("对公用户取号:" + num); V(takeNumber); // 唤醒取号机 P(publicQueue); // 等待轮到自己 // 服务 print("对公用户窗口" + windowNum + "开始服务"); // 服务完毕 }
VIP用户线程:
Thread vipThread() { int num = 0; P(mutex); // 进入临界区 vipNum++; num = vipNum; V(mutex); // 退出临界区 print("VIP用户取号:" + num); V(takeNumber); // 唤醒取号机 P(vipQueue); // 等待轮到自己 // 服务 print("VIP用户窗口" + windowNum + "开始服务"); // 服务完毕 }
普通用户线程:
Thread ordinaryThread() { int num = 0; P(mutex); // 进入临界区 ordinaryNum++; num = ordinaryNum; V(mutex); // 退出临界区 print("普通用户取号:" + num); V(takeNumber); // 唤醒取号机 P(ordinaryQueue); // 等待轮到自己 // 服务 print("普通用户窗口" + windowNum + "开始服务"); // 服务完毕
原文地址: https://www.cveoy.top/t/topic/eyR1 著作权归作者所有。请勿转载和采集!