多线程之生产者消费者模型

//生产者消费者模型
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>

//总共生产产品个数
#define PDT_SIZE 8
//生产者个数
#define PRO_SIZE 1
//消费者个数
#define CON_SIZE 2
//缓冲区个数
#define BUFFER_SIZE 4
//生产者线程
void *thrd_pro(void *arg);
//消费者线程
void *thrd_con(void *arg);

//缓冲区
int g_buffer[BUFFER_SIZE];
//生产者者访问缓冲区索引(打输出信息用)
int g_i;
//消费者访问缓冲区索引(打输出信息用)
int g_j;
//某个消费者发现了最后一件产品,通知其它消费者停止工作
int g_end;
	
//缓冲区非空个数信号量
sem_t sem_hasdata;
//缓冲区为空个数信号量
sem_t sem_nodata;
//缓冲区访问互斥
pthread_mutex_t mutex;

int main()
{
	printf("***********Process is start! Create by xujiali!***********\n");
	printf("There are %d Producters, %d Constumers and %d buffer spaces!\n", PRO_SIZE, CON_SIZE, BUFFER_SIZE);
	
	//初始化缓冲区互斥量
	pthread_mutex_init(&mutex, 0);
	//缓冲区非空个数信号量的初值为0
	sem_init(&sem_hasdata,0,0);
	//缓冲区为空个数信号量的初值为4
	sem_init(&sem_nodata,0,BUFFER_SIZE);

	//生产者线程
	pthread_t pro_thread[PRO_SIZE];
	// 创建生产者线程
	int pro_no;
    for(pro_no = 0; pro_no < PRO_SIZE; ++pro_no)
	{
        if (pthread_create(&pro_thread[pro_no],NULL,thrd_pro,(void*)pro_no) != 0)
            printf("Create pro_thread %d success!\n",pro_no);
    }
	
	//消费者线程
	pthread_t con_thread[CON_SIZE];
	// 创建消费者线程
	int con_no;
    for(con_no = 0; con_no < CON_SIZE; ++con_no)
	{
        if (pthread_create(&con_thread[con_no],NULL,thrd_con,(void*)con_no) != 0) 
            printf("Create con_thread %d success!\n",con_no);
    }
    
    // 逐个join掉生产者线程
	void *tret;
	int i;
    for(i = 0;i < PRO_SIZE; ++i){
        if (pthread_join(pro_thread[i],&tret) == 0)
            printf("Join pro_thread %d success!\n",i);
    }
	
	// 逐个join掉消费者线程
	int j;
    for(j = 0;j < CON_SIZE; ++j){
        if (pthread_join(con_thread[j],&tret) == 0)
            printf("Join con_thread %d success!\n",j);
    }
	
	//干掉信号量
	sem_destroy(&sem_hasdata);
	sem_destroy(&sem_nodata);
	//干掉互斥量
	pthread_mutex_destroy(&mutex);
	printf("***********Process is end! Create by xujiali!***********\n");
	return 0;
}

//生产者线程
void *thrd_pro(void *arg)
{
    int thrd_num = (void*)arg;

    printf("Pro Thread %d is starting.\n",thrd_num);
	int count;
    for(count = 1; count <= PDT_SIZE; ++count) 
	{
		//为空信号量P操作
		sem_wait(&sem_nodata);
		//锁缓冲区
		pthread_mutex_lock(&mutex);
		g_buffer[g_i] = count;  
		printf("	Pro Thread: %d at buffer index :%d insert data: %d\n", thrd_num, g_i, g_buffer[g_i]);
		//采用循环队列的方式维护缓冲区
		g_i = (g_i + 1) % BUFFER_SIZE;
		pthread_mutex_unlock(&mutex);
		
		//非空信号量V操作
		sem_post(&sem_hasdata);
    }

    printf("Pro Thread %d is exiting.\n",thrd_num);
    pthread_exit(NULL); 
}

//消费者线程
void *thrd_con(void *arg)
{
    int thrd_num = (void*)arg;
    printf("Con Thread %d is starting.\n",thrd_num);
	
	while(1)
	{
		//非空信号量P操作
		sem_wait(&sem_hasdata);
		//锁缓冲区
		pthread_mutex_lock(&mutex);
		if (!g_end)
		{
			printf("	Con Thread: %d from buffer index: %d get data:%d.\n", thrd_num, g_j, g_buffer[g_j]);  
		}
		else
		{
			printf("	Con Thread: %d recv notic \"have no products\".\n", thrd_num);  
		}
		
        //最后一件产品被消费
        if (g_buffer[g_j] == PDT_SIZE)  
        {  
            pthread_mutex_unlock(&mutex);
            //非空信号量V操作(通知其它消费者线程结束)
			g_end = 1;
			sem_post(&sem_hasdata);
            break;  
        }  
        g_j = (g_j + 1) % BUFFER_SIZE; 

		pthread_mutex_unlock(&mutex);
		
		//为空信号量V操作
		sem_post(&sem_nodata);
	}

    printf("Con Thread %d is exiting.\n",thrd_num);
    pthread_exit(NULL); 
}

输出:

[db2inst1@RHEL6 study]$ ./08pthread_producter_consumer_utf8
***********Process is start! Create by xujiali!***********
There are 1 Producters, 2 Constumers and 4 buffer spaces!
Pro Thread 0 is starting.
        Pro Thread: 0 at buffer index :0 insert data: 1
        Pro Thread: 0 at buffer index :1 insert data: 2
        Pro Thread: 0 at buffer index :2 insert data: 3
        Pro Thread: 0 at buffer index :3 insert data: 4
Con Thread 0 is starting.
        Con Thread: 0 from buffer index: 0 get data:1.
        Con Thread: 0 from buffer index: 1 get data:2.
        Con Thread: 0 from buffer index: 2 get data:3.
        Con Thread: 0 from buffer index: 3 get data:4.
        Pro Thread: 0 at buffer index :0 insert data: 5
Con Thread 1 is starting.
        Con Thread: 1 from buffer index: 0 get data:5.
        Pro Thread: 0 at buffer index :1 insert data: 6
        Pro Thread: 0 at buffer index :2 insert data: 7
        Con Thread: 0 from buffer index: 1 get data:6.
        Con Thread: 1 from buffer index: 2 get data:7.
        Pro Thread: 0 at buffer index :3 insert data: 8
Pro Thread 0 is exiting.
        Con Thread: 0 from buffer index: 3 get data:8.
        Con Thread: 1 recv notic "have no products".
Con Thread 1 is exiting.
Con Thread 0 is exiting.
Join con_thread 1 success!
***********Process is end! Create by xujiali!***********


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值