Linux多线程编程实验

利用线程原理模拟火车售票系统:

  1. 创建4个线程,其中3个实现售票功能,1个实现退票功能。
  2. 其中3个售票线程设定每隔一定时间售出一张票,退票线程定时退回一张票。
  3. 初始车票数量自行设定,输出显示信息根据情况自行拟定。
#include<stdio.h>
#include<pthread.h>                                                                                                                                                                                            #include<stdlib.h>
#include<unistd.h>
#include<time.h>
#include<sys/time.h>

int tickets=150;//定义售票数
pthread_mutex_t lock;// 定义锁
//获取系统当前时间
 int getSystemTime()   
 {      
 	time_t timer;       
 	struct tm t_tm;       
 	time(&timer);       
 	localtime_r(&timer, &t_tm);       
 	printf("时间: %4d/%02d/%02d %02d:%02d:%02d\r\n", t_tm.tm_year+1900,       
 	t_tm.tm_mon+1, t_tm.tm_mday, t_tm.tm_hour, t_tm.tm_min, t_tm.tm_sec);       
 	return 0;   
 }  
 //余票不多时进行提醒
void Noticeprint(){	
	pthread_mutex_lock(&lock);
	if(tickets<=10&&tickets>0){
		printf("票即将售空!剩余%d张\n\n",tickets);		
	}		
	else if(tickets==0){			
		printf("票已售空!\n\n");		
	}	
	pthread_mutex_unlock(&lock);
} 
//购票
void *GetTickets(void *args){    
	while(1)     
	{          	
		Noticeprint();        
		pthread_mutex_lock(&lock);// 上锁        
		int ticket=rand()%(10-1+1)+1;//售票数值为随机数
	     	if(tickets>0&&ticket<=tickets)
	        {                
	        	getSystemTime();//显示售票时间
			printf("%s正在为您服务!\n",(char*)args);
			printf("客户:买%d张车票\n",ticket);
			printf("窗口:售出%d张车票,剩余%d张\n\n",ticket,tickets-=ticket);
	 		pthread_mutex_unlock(&lock);// 解锁 
	                sleep(2);        
	         }            
	         else         
	         {                 
	         	pthread_mutex_unlock(&lock);// 解锁
	                break;        
	         }       
	}         
}             
//退票
void *Refund(void *args){    
	while(1)     
	{                
		pthread_mutex_lock(&lock);// 上锁        
		int ticket=rand()%(10-1+1)+1;
	        if(tickets>0&&(ticket+tickets)<=150)        
	        {                
	        	sleep(5);
			getSystemTime();
			printf("%s正在为您服务!\n",(char*)args);
			printf("客户:退%d张车票\n",ticket);
			printf("窗口:退回%d张车票,剩余%d张\n\n",ticket,tickets+=ticket);			
			//tickets=tickets-ticket;
			pthread_mutex_unlock(&lock);// 解锁        
		}            
		else         
		{                 
			pthread_mutex_unlock(&lock);            
			break;        
		}        
	}         
}  
int main()   
{    
	pthread_t t1,t2,t3,t4;//存放线程标识符
        pthread_mutex_init(&lock,NULL);// 初始化锁    
        printf("开始售票,现有福州->厦门 150张\n\n");    
        //创建4个子线程    
        pthread_create(&t1,NULL,GetTickets,"窗口1");	
        sleep(1);    
        pthread_create(&t2,NULL,GetTickets,"窗口2");	
        sleep(1);    
        pthread_create(&t3,NULL,GetTickets,"窗口3");	
        sleep(1);    
        pthread_create(&t4,NULL,Refund,"窗口4");	
        sleep(1);     
        //等待线程结束    
        pthread_join(t1,NULL);    
        pthread_join(t2,NULL);    
        pthread_join(t3,NULL);    
        pthread_join(t4,NULL);        
        pthread_mutex_destroy(&lock);// 释放锁
}      

运行结果:
售票:
在这里插入图片描述
退票:
在这里插入图片描述
余票不多时进行提醒:
在这里插入图片描述
售空退出:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值