news 2026/7/8 2:00:03

Qt——银行家算法的分

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Qt——银行家算法的分

1.研究一个银行家如何将总数一定的资金,安全地借给若干个顾客,使顾客既能满足对资金的需求,也使银行家可以收回自己的全部资金,不至于破产

一些限制条件:

  • 每次顾客在借款前必须提前说明所需资金总额
  • 每次借钱都是以一个单位进行
  • 顾客在拿到一个单位的借款前可能需要等待
  • 银行保证顾客的等待时间是有限的(借或不借)

2.Qt中的算法实现方案

  • 使用多线程机制模拟客户和银行
  • 银行优先分配资源给最小需求的客户
  • 当客户的资源需求无法满足的时候
    • 收回已分配的资源
    • 强制结束线程
#include <QCoreApplication> #include <QThread> #include <QMutex> #include <QList> #include <QDebug> class Customer : public QThread { protected: int m_need; //所需金额总额 int m_current; //当前有的金额数 QMutex m_mutex; void run() { bool condition = false; qDebug() << objectName() << "begin to apply money"; do { m_mutex.lock(); condition = (m_current < m_need); m_mutex.unlock(); msleep(10); } while( condition ); qDebug() << objectName() << "end (get enough money)"; } public: Customer(int current, int need) { m_current = current; m_need = need; } void addMoney(int m) { m_mutex.lock(); m_current += m; m_mutex.unlock(); } int backMoney() //需要还的钱 { int ret = 0; m_mutex.lock(); ret = m_current; m_current = 0; m_mutex.unlock(); return ret; } int current() { int ret = 0; m_mutex.lock(); ret = m_current; m_mutex.unlock(); return ret; } int need() { return m_need; } }; class Bank : public QThread { protected: QList<Customer*> m_list; //需要借款的对象列表 int m_total; //总额 void run() { int index = -1; qDebug() << objectName() << "begin: " << m_total; do { index = -1; for(int i=0; i<m_list.count(); i++) { if( m_list[i]->current() == m_list[i]->need()) { qDebug() << objectName() << "take back money from" << m_list[i]->objectName() << " " << m_list[i]->need(); m_total += m_list[i]->backMoney(); } } qDebug() << objectName() << "current: " << m_total; int toGet = 0x00FFFFFF; //初始化一个很大的值 //找到需求量最小的消费者 for(int i=0; i<m_list.count(); i++) { if( m_list[i]->isRunning() ) { int tmp = m_list[i]->need() - m_list[i]->current(); if( toGet > tmp ) { index = i; toGet = tmp; } } } if( index >= 0 ) //找到了 { if( toGet <= m_total ) { qDebug() << objectName() << " give money to: " << m_list[index]->objectName(); m_total--; m_list[index]->addMoney(1); } else { qDebug() << objectName() << "terminate: " << m_list[index]->objectName(); m_total += m_list[index]->backMoney(); m_list[index]->terminate(); } } } while( index >= 0 ); } public: Bank(int total) { m_total = total; } void addCustomer(Customer* customer) { m_list.append(customer); } }; int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); Customer p(4, 8); Customer q(2, 3); Customer r(2, 9); Bank bank(2); p.setObjectName("P"); q.setObjectName("Q"); r.setObjectName("R"); bank.setObjectName("Bank"); bank.addCustomer(&p); bank.addCustomer(&q); bank.addCustomer(&r); p.start(); q.start(); r.start(); bank.start(); return QCoreApplication::exec(); }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/8 1:59:48

数据分析转大模型:从 Demo 走到可维护方案

聊《数据分析转大模型&#xff1a;从 Demo 走到可维护方案》之前&#xff0c;先说一句实在的&#xff1a;别急着背概念&#xff0c;先看它在真实项目里到底解决什么问题。 摘要 先把这篇文章的目标说清楚&#xff1a;看完之后&#xff0c;你应该能判断这件事值不值得做&#…

作者头像 李华
网站建设 2026/7/8 1:52:57

Okbiye|AI 自动搭好演示文稿框架,不用从零手搓 PPT 高效赶汇报

okbiye-免费查重复率aigc检测/开题报告/毕业论文/智能排版/文献综述/AI PPTAI PPT制作 - Okbiye智能写作https://www.okbiye.com/ppt 一、人工做 PPT 多重难题&#xff0c;挤占学习与工作核心时间 不管是在校学生的课程答辩、毕业汇报&#xff0c;还是职场人的月度述职、项目路…

作者头像 李华
网站建设 2026/7/8 1:50:53

WEB作业九&作业十

改成了restful风格界面&#xff0c;进行了分页&#xff1a;查询功能&#xff1a;

作者头像 李华
网站建设 2026/7/8 1:48:08

新手什么时候该打断 Codex,什么时候该继续让它往下做

大家好呀&#xff0c;我是 Lazy熊。 很多人刚开始用 Codex&#xff0c;最容易拿不准的一件事就是&#xff1a; 现在到底该不该打断它。 有时候你看它已经开始分析了&#xff0c; 不知道要不要继续等。 有时候你又隐约感觉它已经开始偏了&#xff0c; 但又怕自己打断太早。…

作者头像 李华
网站建设 2026/7/8 1:47:54

怎么判断一个业务流程 该用 LLM Workflow,还是 Agentic Workflow?

「这条业务流程&#xff0c;到底哪里需要确定性&#xff0c;哪里需要探索性&#xff1f;」 最近做 AI 工作流&#xff0c;我越来越觉得一个问题很重要&#xff1a; 很多时候&#xff0c;我们不是不会用 AI。 而是不知道应该把 AI 放在流程的哪个位置。 一上来就问&#xff…

作者头像 李华