• 首页

  • 官方

  • 主题

  • 关注

  • 联系

操作系统——使用线程模拟解决银行排队叫号问题。 在银行中有一个叫号机,有一个10个座位的长椅,客户在叫号后如果无人在柜台前服务,就会去要求服务;如果柜台忙,则会找长椅入座;如果长椅满则会离开。 要求显示输出叫号过程(包含程序框图)

操作系统——使用线程模拟解决银行排队叫号问题。 在银行中有一个叫号机,有一个10个座位的长椅,客户在叫号后如果无人在柜台前服务,就会去要求服务;如果柜台忙,则会找长椅入座;如果长椅满则会离开。 要求显示输出叫号过程。(包含程序框图)

1.直接跳转到Linux端代码


实验结果

Linux效果图(采用UOS + VScode + g++)


image


程序框图


image



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
posted @ 2021-07-15 14:33  戈小戈  阅读(811)  评论(0编辑  收藏  举报