多线程不重复售票系统

这是一个C语言编写的多线程售票系统,通过信号量实现线程间的同步,确保五个售票窗口不会销售重复的票号。程序创建了五个线程,每个线程模拟一个售票窗口,并在互斥访问票号资源的情况下依次售票。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*====================================================

  • Copyright © 2018 All rights reserved.
  • 文件名称:sell_train_ticket.c
  • 创 建 者:天空 1179588305@qq.com
  • 创建日期:2018年07月27日
  • 描 述:
    ================================================================*/

#include <stdio.h>
#include “head.h”

int j = 0;
sem_t sem1,sem2,sem3,sem4,sem5; //声明信号量

void *fun1(void * arg)
{
int i =0,*tmp = 0;
int *n = &j;
int *str = (int *)arg;
while(1)
{
int ret = sem_trywait(&sem1); //按给定有效值1来顺序执行
if(ret == 0)
{
if(*n > 99)
{
sem_post(&sem2);//释放信号并给下一个
pthread_exit(0);
}
printf(“一窗口售号为: %d \n”,str[*n]);
(*n)++;
sem_post(&sem2);
}
else
{
// sleep(1);
}

}

}
void *fun2(void * arg)
{
int i =0;
int *n = &j;
int *str = (int *)arg;
while(1)
{
int ret = sem_trywait(&sem2);
if(ret == 0)
{
if(*n > 99)
{
sem_post(&sem3);
pthread_exit(0);
}
printf(“二窗口售号为: %d \n”,str[*n]);
(*n)++;
sem_post(&sem3);
}
else
{
// sleep(1);
}
}
}
void *fun3(void * arg)
{
int i =0,*tmp = 0;
int *n = &j;
int *str = (int *)arg;
while(1)
{
int ret = sem_trywait(&sem3);
if(ret == 0)
{
if(*n > 99)
{
sem_post(&sem4);
pthread_exit(0);
}
printf(“三窗口售号为: %d \n”,str[*n]);
(*n)++;
sem_post(&sem4);
}
else
{
// sleep(1);
}
}
}
void *fun4(void * arg)
{
int i =0;
int *n = &j;
int *str = (int *)arg;
while(1)
{
int ret = sem_trywait(&sem4);
if(ret == 0)
{
if(*n > 99)
{
sem_post(&sem5);
pthread_exit(0);
}
printf(“四窗口售号为: %d \n”,str[*n]);
(*n)++;
sem_post(&sem5);
}
else
{
// sleep(1);
}
}
}
void *fun5(void * arg)
{
int i =0,*tmp = 0;
int *n = &j;
int *str = (int *)arg;
while(1)
{
int ret = sem_trywait(&sem5);
if(ret == 0)
{
if(*n > 99)
{
sem_post(&sem1);
pthread_exit(0);
}
printf(“五窗口售号为: %d \n”,str[*n]);
(*n)++;
sem_post(&sem1);
}
else
{
// sleep(1);
}
}
}
int main(int argc, char *argv[])
{
int buff[100] = {0},i = 0,p = 1;
for(i=0;i<100;i++)
{
buff[i] = p;
p++;
}
sem_init(&sem1,0,1); //初始化信号量
sem_init(&sem2,0,0);
sem_init(&sem3,0,0);
sem_init(&sem4,0,0);
sem_init(&sem5,0,0);
pthread_t tid1 = 0,tid2 = 0,tid3 = 0,tid4 = 0,tid5 = 0;//初始化线程
pthread_create(&tid1,NULL,fun1,(void *)buff);//线程的创建
pthread_create(&tid2,NULL,fun2,(void *)buff);
pthread_create(&tid3,NULL,fun3,(void *)buff);
pthread_create(&tid4,NULL,fun4,(void *)buff);
pthread_create(&tid5,NULL,fun5,(void *)buff);
pthread_join(tid1,NULL); //线程的回收
pthread_join(tid2,NULL);
pthread_join(tid3,NULL);
pthread_join(tid4,NULL);
pthread_join(tid5,NULL);
return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值