当前位置: 首页 > news >正文

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(); }
http://www.jsqmd.com/news/1144812/

相关文章:

  • 2026 年最新主流前端技术全景(框架 / 构建 / AI / 跨端 / 底层 / 工程化)
  • 分布式锁的实现方式对比
  • caret 包 RFE 实战:3种模型(线性回归/随机森林/SVM)特征选择性能对比
  • Agent 时代最重要的数据,不是答案,而是 Trajectory
  • 怎么让 Agent Skills 自进化?Agent 回答质量翻倍
  • Codex 实战:别先堆框架,先看边界
  • 从“浅层”到“深层”:LangChain Deep Agents 实战指南
  • Context Engineering 2026: 从提示到信息架构的跃迁
  • PostgreSQL全文检索与倒排索引
  • 大数据时代,Python爬虫工具凭啥成数据获取神器?
  • RAG 优化技术:元数据过滤
  • 编程的通用逻辑:学任何语言前先看懂这套骨架
  • 全面解析Docker容器网络模型配置与故障排查技巧
  • 爬虫转大模型:学习路线先压住哪几个坑
  • 数据通道:RTCDataChannel 可靠与不可靠传输
  • 网络安全小白入行手册:术语、岗位、学习路线一篇说透
  • 工业领域中提供优质服务的震散机公司推荐
  • C# 源生成器使用方法
  • Claude Code 的 Prompt 工程:从静态分离到缓存优化的深度解析
  • STM32与WSEN-ISDS六轴传感器运动追踪开发指南
  • Kubernetes调度机制
  • 量化交易必看:5大类经典策略全解析,从趋势跟踪到统计套利
  • 【OpenHarmony/HarmonyOs 】化学学习软件成就系统设计实践:让学习 App 更有持续使用动力
  • PyTorch DDP 多机多卡配置:2节点8卡集群部署与通信瓶颈分析
  • LIDA v0.1.0 实战:5步调用GPT-4 API,自动生成3种Matplotlib图表
  • RAG - 检索增强生成是什么
  • CPT Markets:把外汇用户支持体系做扎实,偏好清晰说明的读者更容易感受到的标准
  • AoI-Gated LQR:让经典控制律感知数据新鲜度
  • 内蒙古企业做 GEO 优化的 5 个常见误区,呼和浩特本地商家避坑指南
  • Linux Shell 进阶必备!trap 信号捕获完全指南(脚本异常处理 + 优雅退出)