欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

关于多线程与门票的问题

程序员文章站 2022-05-02 16:56:03
...
​#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;
}
​