医院候诊问题
问题描述:
医院某科室,有医生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