linux线程,生产者消费者例子

本文展示了一个使用多线程的生产者消费者模式实例,通过C语言实现,利用POSIX线程库(PTHREAD)。该模式中,多个生产者线程向共享缓冲区写入数据,而多个消费者线程从中读取数据,所有操作都通过互斥锁和条件变量同步。

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

#include <stdio.h>
#include <pthread.h>
#include <assert.h>
#define BSIZE 64

typedef struct
{
	char buf[BSIZE];	
	int occupied;
	int nextin;
	int nextout;
	pthread_mutex_t mutex;
	pthread_cond_t more;
	pthread_cond_t less;
}buffer_t;

buffer_t buffer;

void *producer(char item)
{
	pthread_mutex_lock(&buffer.mutex);	
	while(buffer.occupied>=BSIZE)
		pthread_cond_wait(&buffer.less,&buffer.mutex);
	assert(buffer.occupied<BSIZE);
	buffer.buf[buffer.nextin++] = item;
	buffer.nextin %= BSIZE;
	buffer.occupied++;
	printf("product item = %d/n",item);
	pthread_cond_signal(&buffer.more);
	pthread_mutex_unlock(&buffer.mutex);

	pthread_exit(0);
}

void *consumer()
{
	char item;
	pthread_mutex_lock(&buffer.mutex);
	while(buffer.occupied<=0)
		pthread_cond_wait(&buffer.more,&buffer.mutex);
		
	assert(buffer.occupied>0);
	item = buffer.buf[buffer.nextout++];
	buffer.nextout %= BSIZE;
	buffer.occupied--;
	
	pthread_cond_signal(&buffer.less);
	pthread_mutex_unlock(&buffer.mutex);
	printf("item = %d/n",item);
	
	pthread_exit(0);	
}

int main()
{
	int ret;
	pthread_t tid;
	pthread_t tid1,tid7,tid6,tid5,tid4;	
	pthread_t tid10,tid11,tid12,tid13;
	ret = pthread_create(&tid,NULL,producer,8);
	if(ret)
	{
		printf("error:pthread_create/n");
		exit(-1);	
	}
		ret = pthread_create(&tid7,NULL,producer,7);
	if(ret)
	{
		printf("error:pthread_create/n");
		exit(-1);	
	}	ret = pthread_create(&tid6,NULL,producer,6);
	if(ret)
	{
		printf("error:pthread_create/n");
		exit(-1);	
	}	ret = pthread_create(&tid5,NULL,producer,5);
	if(ret)
	{
		printf("error:pthread_create/n");
		exit(-1);	
	}	ret = pthread_create(&tid4,NULL,producer,4);
	if(ret)
	{
		printf("error:pthread_create/n");
		exit(-1);	
	}
	ret = pthread_create(&tid1,NULL,consumer,NULL);
	if(ret)
	{
		printf("error:pthread_create1/n");
		exit(-1);	
	}
	//
	ret = pthread_join(tid,NULL);
	if(ret)
	{
		printf("error:pthread_join/n");
		exit(-1);		
	}
	ret = pthread_join(tid1,NULL);
	if(ret)
	{
		printf("error:pthread_join1/n");
		exit(-1);		
	}
		ret = pthread_join(tid4,NULL);
	if(ret)
	{
		printf("error:pthread_join1/n");
		exit(-1);		
	}	ret = pthread_join(tid5,NULL);
	if(ret)
	{
		printf("error:pthread_join1/n");
		exit(-1);		
	}	ret = pthread_join(tid6,NULL);
	if(ret)
	{
		printf("error:pthread_join1/n");
		exit(-1);		
	}	ret = pthread_join(tid7,NULL);
	if(ret)
	{
		printf("error:pthread_join1/n");
		exit(-1);		
	}
		ret = pthread_create(&tid10,NULL,consumer,NULL);
	if(ret)
	{
		printf("error:pthread_create1/n");
		exit(-1);	
	}
		ret = pthread_create(&tid11,NULL,consumer,NULL);
	if(ret)
	{
		printf("error:pthread_create1/n");
		exit(-1);	
	}
		ret = pthread_create(&tid12,NULL,consumer,NULL);
	if(ret)
	{
		printf("error:pthread_create1/n");
		exit(-1);	
	}
		ret = pthread_create(&tid13,NULL,consumer,NULL);
	if(ret)
	{
		printf("error:pthread_create1/n");
		exit(-1);	
	}
	return 1;	
}
     备份一下。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值