基于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);
}