关于多线程与门票的问题

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

#define SIZE 10

pthread_mutex_t mutex;     定义锁            

int ticketcount = 100;       定义门票数

void delay()                  一个延时函数
{
	int i = 5000, j;
	while(i > 0)
	{
		j = 10000;
		while(j > 0)
		{
			j--;
		}
		i--;
	}
}

void *ticket(void *arg)             //买票功能函数
{
	int cur_ticket;                 //定义当前票数
	while(1)
	{
		pthread_mutex_lock(&mutex);           //给门上锁
		cur_ticket = ticketcount;             //把票数写过来
		delay();
		if(cur_ticket <= 0)                    //如果门票没了就结束线程并把锁打开
		{
			pthread_mutex_unlock(&mutex);
			break;
		}
		printf("%lu mai %d\n", (unsigned long)pthread_self, cur_ticket);
		cur_ticket--;                //票数减一
		ticketcount = cur_ticket;     //把现在的票数写回去
		pthread_mutex_unlock(&mutex);         //开锁
	}
}

int main()
{
	int ret, i;
	pthread_t tid[SIZE];                  //定义10个线程

	pthread_mutex_init(&mutex, NULL);          //给上锁函数初始化

	for(i = 0; i < SIZE; i++)                 //创建10个线程
	{
		ret = pthread_create(&tid[i], NULL, ticket, NULL);
		if(ret != 0)
		{
			perror("pthread_create");
			exit(1);
		}
	}

	void *status;
	for(i = 0; i < SIZE; i++)           //回收10个线程
	{
		pthread_join(tid[i], &status);
	}

	pthread_mutex_destroy(&mutex);          //销毁锁

	return 0;
}
​

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值