使用线程模拟解决银行排队叫号问题。

在银行中有一个叫号机,有一个10个座位的长椅,客户在叫号后如果无人在柜台前服务,就会去要求服务;如果柜台忙,则会找长椅入座;如果长椅满则会离开。
要求显示输出叫号过程,分析程序运行状况,并对程序作出评估。

程序思想

定义两个信号量chair,call。使用sem_init()初始化信号量,分别赋值为11和2,因为使用sem_wait()时,值为-1就开始阻塞不能访问共享资源叫号服务和座位,call赋初值为2,可以实现一个线程访问另一个线程执行sem_wait()函数时,可以访问共享资源不会阻塞,这样就可以实现一个线程被服务,其余线程也可以接受临界区资源的服务而不被阻塞。同样chair信号量也是这个原理。因为线程的创建和访问时随机的,信号量的等待和释放也是在短时间内完成的,所以使用sleep函数来实现,仿真被服务的时间和在座位上等待的时间。同时在柜台空闲时,座位上的客户可以到柜台上接受服务。本实验代码提前设定了15个客户,在体验方面与真实的的银行服务有差别,因为线程的创建和注销都是瞬时的,只要线程数量足够多,实现结果越接近真实的银行服务。

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<pthread.h>
#include<semaphore.h>
void* consumer(void*);
sem_t chair, call;
int main() {int n,m;n=sem_init(&chair, 0, 11);m=sem_init(&call, 0, 2);if(n!=0&&m!=0){printf("初始化信号量失败!\n");exit(EXIT_FAILURE);}int consumernum[15];pthread_t consumerpthread[10];int i;for (i = 0; i < 15; i++) {consumernum[i] = i + 1;if (pthread_create(&consumerpthread[i], NULL, &consumer, (void*)(&consumernum[i])) != 0) {printf("创建客户线程%d失败!\n", i + 1);exit(EXIT_FAILURE);}}for (i = 0; i < 15; i++)pthread_join(consumerpthread[i], NULL);sem_destroy(&chair);sem_destroy(&call);printf("程序结束\n");return 0;
}
void* consumer(void* arg) {int a;int consumernum = *(int*)arg;printf("客户%d进入!\n", consumernum);sem_wait(&call);sem_getvalue(&call, &a);if(a==1){printf("柜台空闲,%d号客户进入,并直接进行服务!\n", consumernum);printf("%d号客户服务完成,离开柜台!\n",consumernum);sleep(1);sem_post(&call);}if ( a==0 ) {int b;
sem_wait(&chair);sem_getvalue(&chair,&b);if ( b==0) {printf("柜台忙,长椅满,客户%d离开!\n", consumernum);sem_post(&chair);sem_post(&call);}else{int n;printf("柜台忙,长椅空闲,客户%d入座!\n", consumernum);sem_post(&call);sleep(2*consumernum);sem_getvalue(&call,&n);if(n==2){sem_post(&chair);sem_wait(&call);printf("柜台空闲,叫%d号客户进行服务!\n", consumernum);sleep(1);printf("%d号客户服务完成,离开柜台!\n",consumernum);sem_post(&call);}}}return NULL;
}

运行结果

使用线程模拟解决银行排队叫号问题相关推荐

  1. mfc 子窗体 按钮不触发_资深程序员用c++开发MFC银行排队叫号系统,小白看了也能学会...

    这个C++ 银行排队叫号系统是看了书后写出来的程序,运用于MFC理念编写,我看的书是谭浩强的<C++面向对象程序设计>相对计科的书少了前六章 直接从对象讲起,这本书也是本班使用人数最多的一 ...

  2. VS+Qt+C++银行排队叫号系统

     程序示例精选 VS+Qt+C++银行排队叫号系统 如需安装运行环境或远程调试,见文章底部个人QQ名片,由专业技术人员远程协助! 前言 这篇博客针对<<VS+Qt+C++银行排队叫号系统& ...

  3. 基于java+ssm+vue+mysql的银行排队叫号系统

    项目介绍 银行排队叫号系统是以科学合理的机构组织合作.流畅疏通的信息渠道为平台,以客户基本信息.计算机.Internet网络.网络管理软件信息技术为手段建立的信息服务管理系统.系统将借助高速和先进的计 ...

  4. 排队叫号 服务器 不同区域显示,银行排队叫号系统,让你摆脱排队久的问题!...

    原标题:银行排队叫号系统,让你摆脱排队久的问题! 银行排队叫号系统主要由服务器.取号机.集中液晶屏.液晶窗口显示通屏.语音系统.线缆连接部件及其他辅件等组成. ① 网络平台:可以是大厅的局域网络,系统 ...

  5. C语言模拟银行排队叫号(顺序队)

    一.队列 队列是一种具有先进先出(FIFO)特性的线性数据结构,它只允许在队列的两端进行插入和删除操作.队列的一端称为队尾(rear),另一端称为队头(front).新元素总是插入在队列的队尾,而从队 ...

  6. 基于单片机的银行排队叫号系统(Keil工程文件+Proteus仿真原理图+过程详解+全套文档)

    目 录 摘 要 I ABSTRACT II 1 绪论 1 1.1 课题来源 1 1.2 国内外发展状况 1 1.3 有线系统与无线系统 3 1.4 发展前景 4 1.5 系统的设计目的 4 2 系统的 ...

  7. 银行排队叫号系统的模拟

    模拟20秒的输出结果: --------模拟开始-------- 初始化用户: 普通客户 进入排队, 编号:1000 VIP客户  进入排队,  编号:1001 普通客户 进入排队, 编号:1002 ...

  8. 模拟银行窗口排队叫号系统的运作

    最近在网上看到了一道面试题,初看很简单,细看有点意思的一道题目: http://blog.csdn.net/zhangxiaoxiang/archive/2011/04/01/6294132.aspx ...

  9. python排队叫号_python多线程实现代码(模拟银行服务操作流程)

    1.模拟银行服务完成程序代码 目前,在以银行营业大厅为代表的窗口行业中大量使用排队(叫号)系统,该系统完全模拟了人群排队全过程,通过取票进队.排队等待.叫号服务等功能,代替了人们站队的辛苦. 排队叫号 ...

  10. java排队叫号_java多线程(4)模拟排队叫号程序,不能出现交替执行的结果

    package com.javaconcurrencyprogramming.chapter1; /** * @description: 模拟有错误的排队叫号程序 * @author: * @crea ...

最新文章

  1. ZLComboBox自定义控件开发详解
  2. linux一键启动脚本,Linux一键启动、停止、重启Tomcat sh脚本
  3. 牛客网Java刷题知识点之数组、链表、哈希表、 红黑二叉树
  4. Android之程序反复回调一个类的解决办法
  5. mysql树状查询优化_解析SQL中树形分层数据的查询优化
  6. Struts2中的全局结果集
  7. 计算机绘图理论试题库,CAD理论试卷及答案「最新」
  8. 切换账号_在iOS 13在如何切换App Store账号
  9. Python基础之赋值运算符
  10. Eat Doug吃豆豆小游戏纯js代码
  11. 荣耀手机wifi信号如何连接服务器,教你手机无限流量免费上网 荣耀WiFi实测
  12. springboot校园疫情智慧防控微信小程序 毕业设计-附源码011133
  13. 大班音乐机器人反思_幼儿园大班音乐游戏教案活动《机器人》含反思
  14. 晏几道 天涯 青砚1989
  15. 14-网关实战:网关层整合 Swagger 聚合API文档
  16. [KITTI] EVO评价前端里程计精度
  17. 双鱼座三:舞者与梦想家的一周
  18. 关于开源软件名字的由来
  19. 硬件设计38之什么是MCASP?
  20. 杭电不要62java,杭电 2089 不要62

热门文章

  1. html5读取umd,教程:使用umd、commonjs和es三种模式制作自己的React 组件(库)
  2. CTF 杂项 隐写术 密码学及编码 取证技术
  3. 如何用安卓手机做代理服务器
  4. Windows取证分析基础知识大全
  5. CloudMounter一站式网盘管理工具:将大容量网盘服务巧妙地挂载到系统文件管理器中
  6. 微信开放平台Android常见问题
  7. 基于bert的情感分类
  8. 微信卡券管理 - 修改卡券基本信息
  9. 基于SNN脉冲神经网络的Hebbian学习训练过程matlab仿真
  10. 【大模型迁移 2022】Exploring Visual Prompts for Adapting Large-Scale Models