韩跑跑or韩老魔?基于linux线程的售票系统

基于linux完成一个售票系统

/*****************
任务:
         模拟一个售票系统 
思路:
第一个:车票ticket 初值设置为20
第二个:用1两个线程(pthread_create)表示1个售票窗口,每个窗口每次只能售出一张车票ticket,每次实现售票的时间是1S钟,并显示当前剩余的车票数。
第三个:用1个线程表示1个补票的任务,当检测到ticket==0时候,就增加车票10;
优化功能:当座票卖完,可以切换到卖站票的功能

1.主线程main,创建2个线程,一个是售票线程,另一个退票线程
2.定义一个票数的全局变量,主线程里面初始化互斥锁,销毁对应的互斥锁
3.在子线程1里面,负责售票。上锁--票数--共享资源,售出车票tick--,输出一下当前剩余的车票数
4.在子线程2里面,负责退票。上锁--票数--共享资源,增加车票数tick++,输出当前剩余车票数,解锁 

子线程会抢锁,抢共享资源 
*****************/


#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h> 
#include <stdlib.h>
#include <string.h>

int tick = 10;//票数
int flag = 1; 
pthread_mutex_t lock;//定义线程互斥锁指针 

//售票的子线程 
void *sale_tick(void *arg)//先搭框架,然后写逻辑 
{
	//定义变量
	char key;
	 
	while(1)
	{
		//上锁函数 
	    pthread_mutex_lock(&lock);
	    printf("当前的票数:%d\r\n",tick); 
		    
		//提示,用户是否购票
		printf("是否购票,请输入Y/N\r\n");
		scanf("%s",&key);
		 
		if(key == 'y' || key == 'Y')
		{
		    //售出车票 
			tick--;
			sleep(1);
			printf("购票成功,剩余车票:%d\r\n",tick);
			
			//补票功能
			if(tick == 0)
			{
				switch(flag)
				{
					case 1:printf("站票已经售完\r\n");break;
					case 2:printf("坐票已经售完\r\n");break;
				}
				tick = 10;
				flag = 2;
			} 
			
			//解锁函数
		    pthread_mutex_unlock(&lock);
		
		}
		else
		{
			pthread_mutex_unlock(&lock);
			sleep(1);
		}
	}
	pthread_exit(NULL); 

}

//退票的子线程 
void *exit_tick(void *arg)
{
	//定义变量
	char key;
	 
	while(1)
	{
		//上锁函数 
	    pthread_mutex_lock(&lock);
	    printf("当前的票数:%d\r\n",tick); 
		    
		//提示,用户是否购票
		printf("是否退票,请输入Y/N\r\n");
		scanf("%s",&key);
		 
		if(key == 'Y' || key == 'y')
		{
		    //售出车票 
			tick++;
			sleep(1);
			printf("退票成功,剩余车票:%d\r\n",tick);
			
			//解锁函数
		    pthread_mutex_unlock(&lock);
		}
		else
		{
			pthread_mutex_unlock(&lock);
			sleep(1);
		}
	}
	
	pthread_exit(NULL); 

}

int main(int argc,char *argv[])
{
	//定义变量
	pthread_t tid1,tid2;
	
	//初始化线程互斥锁
	pthread_mutex_init(&lock,NULL);
	 
	//创建线程
	pthread_create(&tid1,NULL,sale_tick,(void *)1);
	pthread_create(&tid2,NULL,exit_tick,(void *)2);
	
	//等待对应子线程运行结束
	pthread_join(tid1,NULL);
	pthread_join(tid2,NULL);
	
	//销毁对应的互斥锁
	pthread_mutex_destroy(&lock);
	
	exit(0); 
} 

  • 8
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值