医院候诊问题

医院候诊问题

问题描述:

医院某科室,有医生m名

现有病人n名,

每个病人看病时长已知。写一个函数,做医生和病人的分配,要求医生负载尽量均衡。

代码改自医院排队候诊模型,对多线程不是很熟,只能写一点类伪码做个记录

#include<thread>   
#include<cstdlib>
#include<ctime>
#include<mutex>
#include<condition_variable>
#include<iostream> 
#include<queue>
#include<string>
using namespace std;
 
struct Patient {
	int id; //病人id号
	int take_time; //代表需要就诊的时间 
	Patient(int i,  double t)  //构造函数
		:id(i), take_time(t) {}
	Patient() { id = 0; take_time = 0; } //默认构造函数
};
 
 
struct Docter {
	int id;  //医生编号
	string name; //医生名字
	Docter(int i, const string& n)
		:id(i), name(n) {
	}
	Docter() { id = 0;  name = "扁鹊"; }
};


mutex mtx;
condition_variable produce, consume;
priority_queue<Patient> q; //直接使用了STL的优先队列,q中储存了n个病人结构体,每个结构包含了ID和时间


void DocterProcess(Docter & d) {
 
	Patient temp;
	int time = 0;
	
	while (ok || !q.empty()) {
 
		this_thread::sleep_for(chrono::milliseconds(temp.take_time));//每个医生给病人看病所需的时间
		//(python用time.sleep(time)实现
		cout << "医生[" << d.id << "]给" << temp.id << "号病人看完了病," << "目前空闲\n";
		//模拟看病所花费的时间
 
		unique_lock<mutex> lck(mtx);
		//等到非空才进行下一步操作,否则线程阻塞
		consume.wait(lck, [] {return (q.size() != 0) || !ok; });
 
		//取出队列中头一个病人
		if (!q.empty()) {
			threadings.lock.acquire()
			temp = q.top();
			q.pop();
			threadings.lock.release()//在取出病人时要加锁防止冲突
			cout << "医生[" << d.id << "]开始给" << temp.id << "号病人看病,医生[" << d.id << "]进入忙碌状态 ";
			cout << "队列还有" << q.size() << "位病人.\n";
 
			//唤醒生产者线程
			produce.notify_all();
		}
 
	}
}
 
int main()
{
	const int m = 8; //医生个数
	Docter docters[m];
	for (int i = 0; i < m; ++i) {
		docters[i] = Docter(i, "x");
	}
 
	thread pd[m]; //医生线程
	for (int i = 0; i < m; ++i) {
		pd[i] = thread(DocterProcess, std::ref(docters[i]));
	}
 
	for (int i = 0; i < m; ++i)
		pd[i].join();//判断每个线程是否执行完毕
 
	cout << "程序正常结束\n";
	system("pause");
	return 0;

————————————————
版权声明:本文为CSDN博主「钟子悦」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zhongyuchen/article/details/78602167

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值