/*
车站售票系统
*/
#include <pthread.h> #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <string.h> #include <signal.h> #include <sys/types.h>
//车票数量
int ticket1 = 20; int ticket2 = 10; int ticket3 = 30;
//乘客已购买的票
int ticket1_ok; int ticket2_ok; int ticket3_ok;
//线程
void *task1(void *arg); void *task2(void *arg); void *task3(void *arg);
//信号处理函数
void sig_handler(int arg); int key, key1, q = 1; pthread_mutex_t lock; int main(void) { pthread_t tid1, tid2, tid3; //线程的指针
int fd1, fd2, ds3; //进程的id pthread_mutex_init(&lock, NULL); //动态创建线程互斥锁 printf("欢迎使用xx售票系统!\r\n"); while(1) { printf("请选择需要的服务\r\n"); printf("1、买票, 2、退票, 3、改签, 4、 退出系统\r\n"); scanf("%d", &key); printf("\r\n"); switch(key) { case 1: pthread_create(&tid1, NULL, task1, NULL); //创建线程1,买票 pthread_join(tid1, NULL); //等待线程运行结束 break; case 2: pthread_create(&tid2, NULL, task2, NULL); //创建线程2,退票 pthread_join(tid2, NULL); //等待线程运行结束 break; case 3: pthread_create(&tid3, NULL, task3, NULL); //创建线程3,改签 pthread_join(tid3, NULL); //等待线程运行结束 break; case 4: pthread_mutex_destroy(&lock); //销毁互斥锁 return 0; //结束进程 } } return 0;
}
//线程1,买票
void *task1(void *arg) { int num;
while(1) { printf("当前剩余票数:广州:%d 深圳:%d 肇庆:%d\r\n", ticket1, ticket2, ticket3); printf("请问您要购买哪个地方的票\r\n"); printf("1、广州, 2、深圳, 3、肇庆, 4、退出\r\n-----输入相应数字即可\r\n"); scanf("%d", &key1); printf("\r\n"); if(key1 == 4) { printf("\r\n"); pthread_exit(0); //结束当前线程 } printf("请问您需要购买几张\r\n"); scanf("%d", &num); printf("\r\n"); if(key1 == 1) { if((ticket1 - num) >= 0) { ticket1 -= num; //系统剩余的票数 ticket1_ok += num; //乘客手中的票数 printf("购票成功!\r\n"); } else { printf("购票失败---目前前往广州的票还剩%d张!\r\n", ticket1); } printf("\r\n"); } else if(key1 == 2) { if((ticket2 - num) >= 0) { ticket2 -= num; ticket2_ok += num; printf("购票成功!\r\n"); } else { printf("购票失败---目前前往深圳的票还剩%d张!\r\n", ticket2); } printf("\r\n"); } else if(key1 == 3) { if((ticket3 - num) >= 0) { ticket3 -= num; ticket3_ok += num; printf("购票成功!\r\n"); } else { printf("购票失败---目前前往肇庆的票还剩%d张!\r\n", ticket3); } printf("\r\n"); } }
}
//线程2,退票
void *task2(void *arg) { char temp = 0; //有哪几种票 char flag1 = 0, flag2 = 0, flag3 = 0; //票的种类 char flag11 = 0, flag22 = 0, flag33 = 0; int i, rec; char rec1, rec2, rec3;
if(ticket1_ok > 0) { printf("您购买了%d张前往广州的票!\r\n", ticket1_ok); temp ++; flag1 = 1; } if(ticket2_ok > 0) { printf("您购买了%d张前往深圳的票!\r\n", ticket2_ok); temp ++; flag2 = 1; } if(ticket3_ok > 0) { printf("您购买了%d张前往肇庆的票!\r\n", ticket3_ok); temp ++; flag3 = 1; } if(ticket1_ok == 0 && ticket2_ok == 0 && ticket3_ok == 0) { pthread_mutex_lock(&lock);//加锁 printf("您还没购票!无法为您提供退票服务!\r\n"); printf("10秒后自动关闭该界面!"); signal(14, sig_handler); alarm(10); //10秒后自动结束该线程 for(i = 10; i >= 0; i--) { printf("%d\r\n", i); //倒计时显示 sleep(1); } //while(q); printf("\r\n"); pthread_exit(0); //结束当前线程 } //手中有票 while(1) { rec1 = flag1; rec2 = flag2; rec3 = flag3; printf("请问你需要退的票是?(按4退出该界面!)\r\n"); for(i = 1; i <= temp; i++) //判断已买的票,并排序 { if(rec1 > 0) { printf("%d:广州\t", i); rec1 = 0; flag11 = i; //票的序号 } else if(rec2 > 0) { printf("%d:深圳\t", i); rec2 = 0; flag22 = i; } else if(rec3 > 0) { printf("%d:肇庆\t", i); rec3 = 0; flag33 = i; } } printf("\r\n"); scanf("%d", &rec); //选择要退的票 printf("\r\n"); if(rec == flag11) //退广州的票 { printf("您可以退%d张前往广州的票,请问您需要退几张?\r\n", ticket1_ok); scanf("%d", &rec); //退几张 printf("\r\n"); if(rec > ticket1_ok) { printf("您至多退%d张票\r\n", ticket1_ok); } else { ticket1_ok -= rec; //原有的票减去要退的票 ticket1 += rec; //系统中的票加上退票 if(ticket1_ok > 0) printf("您还有%d张前往广州的票!\r\n", ticket1_ok); else { printf("您已经没有了前往广州的票!\r\n"); flag1 = 0; flag11 = 110; } } printf("\r\n"); } else if(rec == flag22) { printf("您可以退%d张前往深圳的票,请问您需要退几张?\r\n", ticket2_ok); scanf("%d", &rec); printf("\r\n"); if(rec > ticket2_ok) { printf("您至多退%d张票\r\n", ticket2_ok); } else { ticket2_ok -= rec; ticket2 += rec; if(ticket2_ok > 0) printf("您还有%d张前往深圳的票!\r\n", ticket2_ok); else { printf("您已经没有了前往深圳的票!\r\n"); flag2 = 0; flag22 = 120; } } printf("\r\n"); } else if(rec == flag33) { printf("您可以退%d张前往肇庆的票,请问您需要退几张?\r\n", ticket3_ok); scanf("%d", &rec); if(rec > ticket3_ok) { printf("您至多退%d张票\r\n", ticket3_ok); } else { ticket3_ok -= rec; ticket3 += rec; if(ticket3_ok > 0) printf("您还有%d张前往肇庆的票!\r\n", ticket3_ok); else { printf("您已经没有了前往肇庆的票!\r\n"); flag3 = 0; flag33 = 130; } } printf("\r\n"); } else if(rec == 4) { pthread_exit(0);//结束当前线程 } }
//线程3,改签
void *task3(void *arg) { int temp = 0, temp1 = 0; //有几种票 char flag1 = 0, flag2 = 0, flag3 = 0; //票的类型 char flag11 = 0, flag22 = 0, flag33 = 0, flag44 = 0, flag55 = 0, flag66 = 0; char remain1, remain2, remain3; //系统剩下票的标志位 char rec1, rec2, rec3, rec4, rec5, rec6; int local1, local2; //改签的源、目地点 int num = 0; char i;
while(1) { if(ticket1_ok > 0 | ticket2_ok > 0 | ticket3_ok > 0) //手上有票 { printf("您现在有:"); if(ticket1_ok > 0) { printf("%d张前往广州的票\t", ticket1_ok); temp++; flag1 = 1; } if(ticket2_ok > 0) { printf("%d张前往深圳的票\t", ticket2_ok); temp++; flag2 = 1; } if(ticket3_ok > 0) { printf("%d张前往肇庆的票", ticket3_ok); temp++; flag3 = 1; } printf("\r\n"); } else //手上没票 { pthread_mutex_lock(&lock); //加锁 printf("您还没买票,无法为您提供改签服务!如有需要,请到买票窗口买票\r\n"); printf("10秒后自动关闭该界面!"); signal(14, sig_handler); alarm(10); //10秒后自动结束该线程 for(i = 10; i >= 0; i--) { printf("%d\r\n", i); //倒计时显示 sleep(1); } printf("\r\n"); pthread_exit(0); //结束当前线程 } if(ticket1 > 0 | ticket2 > 0 | ticket3 > 0) //系统中还有余票 { printf("现在系统剩余的票有:\r\n"); if(ticket1 > 0) { printf(" 前往广州的票还有%d张\r\n", ticket1); remain1 = 1; temp1++; } if(ticket2 > 0) { printf(" 前往深圳的票还有%d张\r\n", ticket2); remain2 = 1; temp1++; } if(ticket3 > 0) { printf(" 前往肇庆的票还有%d张\r\n", ticket3); remain3 = 1; temp1++; } } else //系统中没有余票 { pthread_mutex_lock(&lock); //加锁 printf("不好意思,现在系统中已经没有余票了!\r\n"); printf("您可以等别人退票或者等加仓!\r\n"); printf("10秒后自动关闭该界面!"); signal(14, sig_handler); alarm(10); //10秒后自动结束该线程 for(i = 10; i >= 0; i--) { printf("%d\r\n", i); //倒计时显示 sleep(1); } printf("\r\n"); pthread_exit(0); //结束当前线程 } /*********************************************************************/ rec1 = flag1; rec2 = flag2; rec3 = flag3; rec4 = remain1; rec5 = remain2; rec6 = remain3; printf("请问您要改签那种票(按4退出该界面!)\r\n"); for(i = 1; i <= temp; i++) { if(rec1 > 0) //flag1 = 0时才不打印 { printf("%d:广州 ", i); rec1 = 0; flag11 = i; //票的序号 } else if(rec2 > 0) { printf("%d:深圳 ", i); rec2 = 0; flag22 = i; } else if(rec3 > 0) { printf("%d:肇庆 ", i); rec3 = 0; flag33 = i; } } printf("\r\n"); scanf("%d", &local1); printf("\r\n"); if(local1 == 4) { pthread_exit(0);//结束当前线程 } printf("现在有票的地点有:\r\n"); for(i = 1; i <= temp1; i++) { if(rec4 > 0) { printf("%d:广州 ", i); rec4 = 0; //flag4 = 0时才不打印 num = 1; flag44 = i; } else if(rec5 > 0) { printf("%d:深圳 ", i); rec5 = 0; num = 1; flag55 = i; } else if(rec6 > 0) { printf("%d:肇庆 ", i); rec6 = 0; num = 1; flag66 = i; } } printf("\r\n"); if(num == 0) //不能改签 { printf("\r\n"); printf("目前没有能改签的地方\r\n"); printf("您可以等别人退票或者等加仓!\r\n"); printf("\r\n"); } else //能改签 { printf("\r\n"); printf("请问您要改签到什么地方?\r\n"); scanf("%d", &local2); //目地点 printf("请问您需要改签几张\r\n"); scanf("%d", &num); if(local1 == flag11) //原地点是广州 { if(ticket1_ok < num) //手上的票数少过要改的数量 { printf("改签失败,您手上没有%d张原地点是广州的票\r\n", num); } else if(local2 == flag44) //目地点是广州 { printf("不能改签到一样的地方!\r\n"); } else if(local2 == flag55) //目地点是深圳 { if(num > ticket2) //系统现有的票数少过要改的数量 { printf("改签失败,现在系统中仅有%d张前往深圳的票\r\n", ticket2); } else { printf("改签成功!\r\n"); ticket1_ok -= num; //手上前往广州的票 ticket1 += num; //系统中前往广州的票 ticket2_ok += num; //手上前往深圳的票 ticket2 -= num; //系统中前往深圳的票 } } else if(local2 == flag66) //目地点是肇庆 { if(num > ticket3) //系统现有的票数少过要改的数量 { printf("改签失败,现在系统中仅有%d张前往肇庆的票\r\n", ticket3); } else { printf("改签成功!\r\n"); ticket1_ok -= num; //手上前往广州的票 ticket1 += num; //系统中前往广州的票 ticket3_ok += num; //手上前往肇庆的票 ticket3 -= num; //系统中前往肇庆的票 } } } else if(local1 == flag22) //原地点是深圳 { if(ticket2_ok < num) //手上的票数少过要改的数量 { printf("改签失败,您手上没有%d张原地点是深圳的票\r\n", num); } else if(local2 == flag44) //目地点是广州 { if(num > ticket2) //系统现有的票数少过要改的数量 { printf("改签失败,现在系统中仅有%d张前往广州的票\r\n", ticket1); } else { printf("改签成功!\r\n"); ticket2_ok -= num; //手上前往深圳的票 ticket2 += num; //系统中前往深圳的票 ticket1_ok += num; //手上前往广州的票 ticket1 -= num; //系统中前往广州的票 } } else if(local2 == flag55) //目地点是深圳 { printf("不能改签到一样的地方!\r\n"); } else if(local2 == flag66) //目地点是肇庆 { if(num > ticket3) //系统现有的票数少过要改的数量 { printf("改签失败,现在系统中仅有%d张前往肇庆的票\r\n", ticket3); } else { printf("改签成功!\r\n"); ticket2_ok -= num; //手上前往深圳的票 ticket2 += num; //系统中前往深圳的票 ticket3_ok += num; //手上前往肇庆的票 ticket3 -= num; //系统中前往肇庆的票 } } } else if(local1 == flag33) //原地点是肇庆 { if(ticket3_ok < num) //手上的票数少过要改的数量 { printf("改签失败,您手上没有%d张原地点是肇庆的票\r\n", num); } else if(local2 == flag44) //目地点是广州 { if(num > ticket2) //系统现有的票数少过要改的数量 { printf("改签失败,现在系统中仅有%d张前往广州的票\r\n", ticket1); } else { printf("改签成功!\r\n"); ticket3_ok -= num; //手上前往肇庆的票 ticket3 += num; //系统中前往肇庆的票 ticket1_ok += num; //手上前往广州的票 ticket1 -= num; //系统中前往广州的票 } } else if(local2 == flag55) //目地点是深圳 { if(num > ticket3) //系统现有的票数少过要改的数量 { printf("改签失败,现在系统中仅有%d张前往深圳的票\r\n", ticket2); } else { printf("改签成功!\r\n"); ticket3_ok -= num; //手上前往肇庆的票 ticket3 += num; //系统中前肇庆圳的票 ticket2_ok += num; //手上前往深圳的票 ticket2 -= num; //系统中前往深圳的票 } } else if(local2 == flag66) //目地点是肇庆 { printf("不能改签到一样的地方!\r\n"); } } printf("\r\n"); } //标志位清零 temp = temp1 = flag1 = flag11 = flag2 = flag22 = flag3 = flag33 = flag44 = flag55 = flag66 = 0; } }
//信号处理函数
void sig_handler(int arg) { q = 0; pthread_mutex_unlock(&lock); //解锁 }