线程:生产者与消费者问题

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <time.h>

#define HOUSE_MAX 50
// 栈结构
char house[HOUSE_MAX] = {};
// 栈顶下标
int top = 0;

// 互斥量(确保只有一个线程访问栈顶)
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
// 满仓条件变量(满仓时生产线程睡入)
pthread_cond_t full = PTHREAD_COND_INITIALIZER;
// 空仓条件变量(空仓时消费线程睡入)
pthread_cond_t null = PTHREAD_COND_INITIALIZER;

// 显示仓库
void show_house(char* who,char* op,char ch)
{
	printf("%s:",who);
	for(int i=0; i<=top; i++)
	{
		printf("%c",house[i]);
	}
	printf("%s%c\n",op,ch);
}

// 生产者线程
void* production(void* arg)
{
	char* who = (char*)arg;
	for(;;)
	{
		char ch = 'A' + rand() % 26;
		
		pthread_mutex_lock(&mutex);
		//醒来后要再次检查是否满仓
		while(HOUSE_MAX <= top)
		{
			printf("%s:满仓\n",who);
			pthread_cond_wait(&full,&mutex);
		}
		
		show_house(who,"<-",ch);
		// 入仓数据
		house[top++] = ch;
		usleep(rand()%100000);
		// 已经确保仓库不空,通知消费
		pthread_cond_signal(&null);
		// 解锁
		pthread_mutex_unlock(&mutex);
		// 模拟现实情况
		usleep(rand()%100000);
	}
	return NULL;
}

// 消费者线程
void* consume(void* arg)
{
	char* who = (char*)arg;
	for(;;)
	{ 
		// 加锁
		pthread_mutex_lock(&mutex);
		// 检查仓库中是否空的
		while(0 == top)
		{
			printf("%s:空仓\n",who);
			pthread_cond_wait(&null,&mutex);
		}
		
		// 消费数据
		char ch = house[--top];
		show_house(who,"->",ch);
		usleep(rand()%100000);
		pthread_cond_signal(&full);
		pthread_mutex_unlock(&mutex);
		usleep(rand()%100000);
	}
}

int main()
{
	srand(time(NULL));
	pthread_t pid[10] = {};

	pthread_create(&pid[0],NULL,production,"生产1");
	pthread_create(&pid[1],NULL,consume,"消费1");
	pthread_create(&pid[2],NULL,production,"生产2");
	pthread_create(&pid[3],NULL,consume,"消费2");
	pthread_create(&pid[4],NULL,production,"生产3");
	pthread_create(&pid[5],NULL,consume,"消费3");
	pthread_create(&pid[6],NULL,production,"生产4");
	pthread_create(&pid[7],NULL,consume,"消费4");
	pthread_create(&pid[8],NULL,production,"生产5");
	pthread_create(&pid[9],NULL,consume,"消费5");

	for(int i=0; i<10; i++)
	{
		pthread_join(pid[i],NULL);
	}
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值