代码编织梦想

生产者和消费者

生产者消费者问题(英语:Producer-consumer problem),也称有限缓冲问题(英语:Bounded-buffer problem),是一个多线程同步问题的经典案例。该问题描述了共享固定大小缓冲区的两个线程——即所谓的“生产者”和“消费者”——在实际运行时会发生的问题。生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程。与此同时,消费者也在缓冲区消耗这些数据。该问题的关键就是要保证生产者不会在缓冲区满时加入数据,消费者也不会在缓冲区中空时消耗数据。

例: 仓库默认产品为3个,同一时刻只能生产者或消费者中的一个进入仓库(互斥)
如果仓库的产品数量为0,消费者不允许进入仓库购买(条件变量)

在这里插入图片描述


1 代码示例

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

//定义互斥锁
pthread_mutex_t mutex;

//定义条件变量
pthread_cond_t cond;

//定义一个仓库,默认有3个产品
int num = 3;

void *consumption_function(void *arg)  //消费
{
	while(1)
	{
		//申请上锁
		pthread_mutex_lock(&mutex);

		//判断仓库是否为空,如果为空,等待条件变量满足
		if(0 == num)	//仓库为空
		{
			printf("%s发现仓库为空,等待生产\n", (char *)arg);
			pthread_cond_wait(&cond, &mutex);  //如果为空,阻塞
		}

		//进入仓库购买产品  
		int is_shopping = 0;
		if(num > 0)
		{
			is_shopping = 1;
			--num;
			printf("%s购买了一个产品,仓库剩余%d个\n", (char *)arg, num);
		}
		
		//解锁
		pthread_mutex_unlock(&mutex);
		
		//使用产品
		if(is_shopping == 1)
		{
			printf("%s正在使用产品\n",(char *)arg);
			sleep(rand()%5);
		}
		
	}
	return NULL;
}	

void *production_function(void *arg)  //生产
{
	while(1)
	{
		//生产一个产品
		sleep(rand()%5);
		
		//上锁,进入仓库
		pthread_mutex_lock(&mutex);

		//将产品放入仓库
		num++;
		printf("%s放入一个产品,仓库剩余%d个\n",(char *)arg, num);
		
		//通知条件变量阻塞的线程
		pthread_cond_broadcast(&cond);

		//解锁
		pthread_mutex_unlock(&mutex);
	}
	
	return NULL;
}	

int main(int argc, char const *argv[])
{
	//设置随机数种子
	srand(time(NULL));
	
	//初始化锁
	pthread_mutex_init(&mutex, NULL);

	//初始化条件变量
	pthread_cond_init(&cond, NULL);
	
	pthread_t tid1, tid2, tid3;
	pthread_create(&tid1, NULL, consumption_function, "消费者A");
	pthread_create(&tid2, NULL, consumption_function, "消费者B");
	pthread_create(&tid3, NULL, production_function, "生产者A");
	
	//等待线程结束
	pthread_join(tid1, NULL);
	pthread_join(tid2, NULL);
	pthread_join(tid3, NULL);
	
	//销毁锁
	pthread_mutex_destroy(&mutex);
	//销毁条件变量
	pthread_cond_destroy(&cond);
	
	return 0;
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/K3169/article/details/127705477

分别在windows和linux下用信号量解决生产者消费者问题-爱代码爱编程

用信号量解决生产者消费者问题                                       实验目的   通过实验,掌握Windows和Linux环境下互斥锁和信号量的实现 方法,加深对临界区问题和进程同步机制的理解,同时熟悉利用Windows API和Pthread API进行多线程编程的方法。 实验内容   1.  在Wi

生产者消费者问题的c语言实现_时间里的河的博客-爱代码爱编程_c生产者消费者代码实现

实验六 生产者/消费者问题实验 一、实验目的 掌握Linux下生产者/消费者问题算法的实现   二、实验原理 1.clone系统调用: 功能:创建一个轻进程或线程 用法: intclone (int (*fn)(void *arg),void *stack,int flag,void *arg); 其中, ★fn是轻进程所执行的函数;stack是轻进程所

linux下实现生产者——消费者模型(代码)_正在起飞的蜗牛的博客-爱代码爱编程_生产者消费者代码实现linux

涉及到的知识点: 链表操作、互斥量、条件变量、线程 代码说明: 代码是在Linux环境下运行,主要思路是在主函数中创建两个线程:生产者和消费者,将生产的产品保存在链表中。当没有产品时,消费者睡眠,直到被生产者唤醒,当产

Linux系统编程:生产者消费者问题-爱代码爱编程

Description 生产者消费者共享缓冲区,生产者向缓冲区中放数据,消费者从缓冲取中取数据,当缓冲区中被放满时,生产者进程就必须进入挂起状态,直到消费者从缓冲中取走数据时,生产者才能继续向缓冲区中存放数据,同样当缓冲取中没有数据时,消费者进程就必须进入挂起休眠状态,直到生产者向缓冲区中放入数据时,消费者才能被唤醒继续从缓冲区中取走数据。 分析 首

【Linux】C++模拟实现 多线程编程 之 生产者与消费者模型-爱代码爱编程

生产者与消费者模型 C++模拟多线程生产者与消费者模型方法一:互斥量与条件变量模拟实现方法二:信号量模拟实现 C++模拟多线程生产者与消费者模型 方法一:互斥量与条件变量模拟实现 #include <stdio.h>

linux下C语言实现生产者-消费者问题实现-爱代码爱编程

linux下C语言实现生产者-消费者问题实现  更详细的文章:详细的文章 在这里实现3个生产者与4个消费者,实现不同数目的话自己更改define即可 pthread_create、pthread_join、pthread_mutex_init 、pthread_mutex_lock、pthread_mutex_unlock用法from:pthread

Linux多线程——生产者消费者模型-爱代码爱编程

目录 一.生产者消费者模型         1.1 什么是生成者消费者模型         1.2 生产者消费者模型的优点         1.3 基于阻塞队列实现生产者消费者模型          1.4 POSIX信号量         1.4.1 信号量概念         1.4.2 P操作和V操作         1.4.3 理解

Linux C系统编程——使用信号量实现生产者,消费者问题(两分钟搞明白)-爱代码爱编程

信号量和信号不是同一个东西。 信号量 :指的是semaphore,相当于设置初始值为N的互斥量, N就表示同时访问的线程数(针对的是线程同步问题)信号:指的是用来实现进程与进程之间,进程与线程之间的一种异步机制。(针对的是异步处理的问题) 实验源码 下面展示一些 内联代码片。 重在理解思路 #include <unistd.h> #

Linux下生产者消费者问题的C语言实现-爱代码爱编程

注:查看全文请关注作者,或点击前往:生产者-消费者问题的C语言实现 实验六 生产者-消费者问题实现 实验题目 要求 在Linux操作系统下用C实现经典同步问题:生产者—消费者,具体要求如下: (1) 一个大小为10的缓冲区,初始状态为空。 (2) 2个生产者,随机等待一段时间,往缓冲区中添加数据,若缓冲区已满,等待消费者取走数据之后再添加,重复1

Linux实验 ---- 生产者和消费者问题 实验四-爱代码爱编程

实验目的 “生产者消费者”问题是一个著名的同时性编程问题的集合。通过编写经典的“生产者消费者”问题的实验,读者可以进一步熟悉Linux 中多线程编程,并且掌握用信号量处理线程间的同步互斥问题。 实验内容 “生产者消费者”问题描述如下。 有一个有限缓冲区和两个线程:生产者和消费者。他们分别把产品放入缓冲区和从缓冲区中拿走产品。当一个生产者在缓冲区满时必