多线程模拟售票

本文通过实例探讨了如何使用多线程技术模拟售票过程,深入理解线程间的并发与同步,涉及线程安全问题及解决方案。

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

线程1:

#include <stdio.h>
#include <stdlib.h>

#define SIZE    10

int Ticket = 200;
pthread_mutex_t mutex;    //定义互斥锁

void delay()
{
	int x = 10000, y;

	while (x > 0)
	{
		y = 10000;
		while (y > 0)
		{
			y--;
		}
		x--;
	}
}

void *SaleTicket(void *arg)
{
	int cur_ticket;
	while (1)
	{
		pthread_mutex_lock(&mutex);  //访问数据前加锁
		cur_ticket = Ticket;
		if (cur_ticket <= 0)
		{
			pthread_mutex_unlock(&mutex);
			break;
		}
		printf("%lu get ticket %d\n", pthread_self(), cur_ticket);
		cur_ticket--;
		//usleep(10000);
		delay();
		Ticket = cur_ticket;
		pthread_mutex_unlock(&mutex);   //访问数据结束,解锁
	}
}

int main()
{
	pthread_t tid[SIZE] = {0};
	int i, ret;

	pthread_mutex_init(&mutex, NULL);   //初始化互斥锁

	for (i = 0; i < SIZE; i++)
	{
		ret = pthread_create(&tid[i], NULL, SaleTicket, NULL);
		if (ret != 0)
		{
			perror("pthread_create");
		}
	}

	for (i = 0; i < SIZE; i++)
	{
		void *status;
		pthread_join(tid[i], &status);
	}

	pthread_mutex_destroy(&mutex);

	return 0;
}

线程2:

#include <stdio.h>
#include <pthread.h>

int Ticket = 100;
pthread_mutex_t mutex;
pthread_cond_t cond;   //条件变量

void delay()
{
	int x = 5000, y;

	while (x > 0)
	{
		y = 10000;
		while (y > 0)
		{
			y--;
		}
		x--;
	}
}

void *SaleTicketA(void *arg)
{
	int cur_ticket;

	while (1)
	{
		pthread_mutex_lock(&mutex);
		cur_ticket = Ticket;
		if (cur_ticket <= 0)
		{
			pthread_mutex_unlock(&mutex);
			break;
		}
		if (cur_ticket == 50)
		{
			pthread_cond_signal(&cond);   //唤醒线程B
		}
		printf("A get ticket %d\n", cur_ticket);
		cur_ticket--;
		Ticket = cur_ticket;
		pthread_mutex_unlock(&mutex);
		delay();
	}
}

void *SaleTicketB(void *arg)
{
	int cur_ticket;

	while (1)
	{
		pthread_mutex_lock(&mutex);
		cur_ticket = Ticket;
		if (cur_ticket <= 0)
		{
			pthread_mutex_unlock(&mutex);
			break;
		}
		if (cur_ticket > 50)
		{
			pthread_cond_wait(&cond, &mutex);   //线程挂起 同时解锁
			cur_ticket = Ticket;
		}
		printf("B get ticket %d\n", cur_ticket);
		cur_ticket--;
		Ticket = cur_ticket;
		pthread_mutex_unlock(&mutex);
		delay();
	}
}

int main()
{
	int ret;
	pthread_t tid[2] = {0};

	pthread_mutex_init(&mutex, NULL);
	pthread_cond_init(&cond, NULL);

	ret = pthread_create(&tid[0], NULL, SaleTicketA, NULL);
	if (ret != 0)
	{
		perror("pthread_create");
	}

	ret = pthread_create(&tid[1], NULL, SaleTicketB, NULL);
	if (ret != 0)
	{
		perror("pthread_create");
	}

	void *status;
	pthread_join(tid[0], &status);
	pthread_join(tid[1], &status);

	pthread_mutex_destroy(&mutex);
	pthread_cond_destroy(&cond);

	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值