![](https://img2020.cnblogs.com/blog/1975550/202107/1975550-20210715142924234-168536620.png)
操作系统——使用线程模拟解决银行排队叫号问题。 在银行中有一个叫号机,有一个10个座位的长椅,客户在叫号后如果无人在柜台前服务,就会去要求服务;如果柜台忙,则会找长椅入座;如果长椅满则会离开。 要求显示输出叫号过程(包含程序框图)
操作系统——使用线程模拟解决银行排队叫号问题。 在银行中有一个叫号机,有一个10个座位的长椅,客户在叫号后如果无人在柜台前服务,就会去要求服务;如果柜台忙,则会找长椅入座;如果长椅满则会离开。 要求显示输出叫号过程。(包含程序框图)
实验结果
Linux效果图(采用UOS + VScode + g++)
![image](https://img2020.cnblogs.com/blog/1975550/202107/1975550-20210715142924234-168536620.png)
程序框图
![image](https://img2020.cnblogs.com/blog/1975550/202107/1975550-20210715142953191-1350253896.png)
C++代码:
#include<unistd.h>
#include<semaphore.h>
#include<pthread.h>
#include<iostream>
using namespace std;
#define PRODUCER 1//生产者数量
#define CONSUMER 1//消费者数量
#define BUFFER 10//缓冲区数量
sem_t empty_sem,full;
//同步信号量
pthread_mutex_t mutex;
//互斥信号量
int buffer[10];
//缓冲区
int index_in=0,index_out=0;
//生产者 消费者 存放消费的位置
int m=0;
int n;
int i=0;
float sleeptime;
bool isdead=true;
void *Producer(void *)//客户叫号 {
// sleep(1);
while(isdead) {
m++;
//随机产生叫号编号
if(i<10) {
i++;
sem_wait(&empty_sem);
pthread_mutex_lock(&mutex);
buffer[index_in]=m;
cout<<"等待服务,叫号编号为:"<<m<<endl;
index_in=(index_in+1)%BUFFER;
pthread_mutex_unlock(&mutex);
sem_post(&full);
} else {
cout<<"长椅已满,客户已经离开,叫号编号为:"<<m<<endl;
}
sleep(1);
}
buffer[10]= {
NULL
}
;
//清空
cout<<"大门关闭,客户停止进入,等待客户离开。"<<endl;
return 0;
}
void *Consumer(void *)//窗口处理业务 {
while(isdead) {
sleeptime=rand() % (1000) / (float)(100);
i--;
sem_wait(&full);
pthread_mutex_lock(&mutex);
n=buffer[index_out];
cout<<"叫号编号为"<<n<<""<<"的客户正在办理业务,请等待。"<<endl;
index_out=(index_out+1)%BUFFER;
pthread_mutex_unlock(&mutex);
sem_post(&empty_sem);
sleep(sleeptime);
}
cout<<"停止办理业务。"<<endl;
return 0;
}
int main() {
int in;
int sinit1=sem_init(&empty_sem,0,BUFFER);
//初始化同步信号量,信号量是由进程内线程共享
int sinit2=sem_init(&full,0,0);
int minit=pthread_mutex_init(&mutex,NULL);
//初始化互斥信号量,使用默认的快速互斥锁属性
int tmp1, tmp2;
pthread_t thread1, thread2;
int producer, consumer;
producer = pthread_create(&thread1, NULL, Producer, NULL);
if (producer!= 0)
cout<<"无法开始办理业务。"<<endl; else
cout<<"开始办理业务。"<<endl;
consumer = pthread_create(&thread2, NULL,Consumer, NULL);
if (consumer!= 0)
cout<<"大门未开,客户无法进入。"<<endl; else
cout<<"大门开启,客户开始进入叫号。"<<endl;
while(cin>>in) {
if(in==0) {
//输入0结束进程
isdead=false;
break;
}
}
sleep(sleeptime+1.0);
return 0;
}
//g++ test61.cpp -o test61 -lpthread&&./test61