【Linux系统编程(十四)】生产者和消费者问题

2023-05-16

文章目录

  • 生产者和消费者
    • 1 代码示例

生产者和消费者

生产者消费者问题(英语: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;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Linux系统编程(十四)】生产者和消费者问题 的相关文章

  • 2019-08-10 homebrew更新更新慢的问题

    Homebrew 镜像使用帮助 直接在 路径下执行以下命令 替换现有上游 git C 34 brew repo 34 remote set url origin https mirrors tuna tsinghua edu cn git
  • contos安装ElasticSearch解决 bash: shasum: 未找到命令...

    centos需要运行一下 xff1a yum install perl Digest SHA
  • yum 无法使用的解决

    在网上看到的解决方法 xff0c 故保存于此 问题 xff1a Loaded plugins fastestmirror Determining fastest mirrors YumRepo Error All mirror URLs a
  • 报错-crontab -e 定时任务执行失败排查

    使用 crontab e 定时启动 jar 包服务失败 xff0c 排查过程如下 xff1a 1 查看 crontab 服务 span class token function crontab span l 陈列出了待执行任务列表 xff0
  • 生产者消费者问题

    目录 生产者消费者模型概述 生产者消费者模型的优点 1 解耦 2 并发性 3 忙闲不均 Linux系统下模拟实现 思路 代码实现 运行结果 生产者消费者模型概述 生产者消费者问题也称为有限缓冲问题 大概描述就是 xff1a 两个或更多的线程
  • Android指纹验证(BiometricPrompt)

    1 先导依赖 implementation span class token string 34 androidx biometric biometric 1 1 0 34 span 2 布局里写一个按钮方法 span class toke
  • 给定一个链表,判断链表中是否有环

    给定一个链表 xff0c 判断链表中是否有环 如果链表中有某个节点 xff0c 可以通过连续跟踪 next 指针再次到达 xff0c 则链表中存在环 为了表示给定链表中的环 xff0c 我们使用整数 pos 来表示链表尾连接到链表中的位置
  • qemu+kvm安装银河麒麟V10SP1 arm64 虚拟机

    qemu 43 kvm安装银河麒麟V10SP1 arm64 虚拟机 安装 qemu 工具准备下列文件创建虚拟硬盘执行启动命令通过VNC访问虚拟机安装 tigervnc连接 VNC 安装 qemu 工具 span class token fu
  • eclipse java底部输入框不见解决

    那是eclipse种的Console控制台 xff0c 重新显示方式有以下几种 xff1a 1 方法一 xff1a 快捷键 xff1a ALT 43 SHIFT 43 Q 2 方法二 xff1a 点击工具栏上的 window 输入reset
  • 人脸识别系列一 | 特征脸法

    前言 从这里开始 xff0c 我会不定期的更新一些人脸识别的有趣算法和小demo算法 xff0c 源码也会开放出来 xff0c 自己在学习的过程中希望也能帮助到公众号中对这方面感兴趣的小伙伴 xff0c 无论是从源码角度 xff0c 还是从
  • HDU 5656 CA Loves GCD dp,常数优化

    题目链接 xff1a http acm hdu edu cn showproblem php pid 61 5656 题意 xff1a 解法 xff1a span class hljs comment HDU 5656 span span
  • python爬虫抓包爬取NBA中文网近20年球员数据

    爬取NBA中文网近20年的球员数据 因为NBA中文网球员数据是通过json异步加载的 xff0c 所以需要抓包实现 import time import requests import json import csv 获取json文件里面的
  • 解决 centos7 创建服务 启动服务 报错control process exited, code=exited status=203

    部署srs gb28181 流媒体服务 时 xff0c 想添加到服务开机启动 xff0c 发现启动报错control process exited code 61 exited status 61 203 百度上找了好多资料 xff0c 全
  • ubuntu18.4使用xfce4安装VNC

    ubuntu18 4使用xfce4安装VNC 1 安装VNCServer sudo apt get install vnc4server 2 安装Xfce4 sudo apt get install xfce4 3 配置VNCServer密
  • 009:Python字符串的使用

    字符串的定义 所谓字符串 xff0c 就是由零个或多个字符组成的有限序列 xff0c 一般记为 xff1a 在Python程序中 xff0c 如果把单个或多个字符用单引号或者双引号包围起来 xff0c 就可以表示一个字符串 字符串中的字符可
  • BUG笔记:Win XP IE8下HTML Parsing Error: Unable to modify the parent container element before the child

    xff3b Bug描述 xff3d Windows XP IE8的某些版本下页面只显示一部分 xff0c 其余为空白 IE左下角有惊叹号报错标志 xff0c 点开后显示字符如下 xff1a HTML Parsing Error Unable
  • 日常积累

    1 如何对mysql数据库已存在表进行修改 2 查看mysql 数据库引擎 3 defunct进程 ps aux grep defunct 表示的是僵尸进程 4 检测进程打开的文件句柄数 xff1a lsof p pid 5 sg test
  • Linux新手入门:Unable to locate package错误解决办法

    最近刚开始接触 Linux xff0c 在虚拟机中装了个 Ubuntu xff0c 当前的版本是 Ubuntu 11 10 xff0c 装好后自然少不了安装一些软件 xff0c 在设置了软件的源后 xff0c 就开始了 sudo apt g
  • Android内存管理、监测剖析

    Android内存管理机制 xff1a Android内存管理主要有 xff1a LowMemory Killer机制 xff0c Ashmem xff0c PMEM ION及Native内存和Dalvik内存管理管理和JVM垃圾回收机制
  • gnome系统托盘协议spec(tray icon)

    最新spec xff1a http standards freedesktop org systemtray spec systemtray spec 0 3 html 系统 托盘协议规范 xff08 基于Xwindow的桌面环境 xff0

随机推荐

  • 阿里秋招面试

    1 请介绍项目 说了项目的分布式设计 服务器负载均衡和集群 redis xff08 缓存 同步 主从架构 xff09 session共享 ActiveMQ实现消息传递 2 项目中遇到的难点 3 问实习经历 4 问Java内存模型 5 讲一下
  • 在Ubuntu14.04.5上安装OpenCV2.4.9时遇到的各种问题

    从昨天到今天 首先 xff0c 我是按照这个博客进行安装的 xff0c 虽然他是以 xff2f xff50 xff45 xff4e xff43 xff56 3 0为样板但是安装基本都大同小异 xff0e xff08 博客地址 xff1a h
  • windows 下面 查找一个文件夹下的所有文件。整理版

    第一种方法 xff0c 可以再vc6 0上直接运行 include lt AFX H gt void FindFilesInOneFolder const std string folder in vector lt string gt a
  • 如何让Qtableview背景透明

    第一种 xff1a 直接编辑样式表 xff1a 第二种 xff1a 在代码中设置 xff1a ui tableView gt setStyleSheet 34 background color transparent 34
  • vs运行,f10失效

    在 Visual Studio 中 xff0c 按 F10 快捷键是用于单步执行代码的调试命令 如果该快捷键失效了 xff0c 可以尝试以下方法进行排除问题 xff1a 确保当前处于调试模式 xff1a 在 Visual Studio 的菜
  • 嵌入式linux应用开发入门纲要

    目录 C语言基础C 43 43 拓展linux基本操作io操作数据结构进程线程网络编程sqlite数据库实战项目 C语言基础 基本数据类型 条件语句 循环语句 函数 算术运算 逻辑运算 指针 结构体 联合体 枚举 malloc C 43 4
  • 全能扫地机器人的想法

    他要会自己充电 最好 xff0c 他是可以太阳能充电 xff0c 没电了 xff0c 他自己去晒太阳 他要自己规划路线 他最好我不在家的时候工作 他得会自己打包好垃圾 他要会拖地 我可以语音控制他 我叫他的时候 xff0c 他可以报告自身的
  • qt根据组件名字找到组件

    比方说知道一个在tw下QPushButton的ObjectNam为 34 ok 34 xff0c 那么它的组件指针就是 xff1a auto btn 61 ui gt tw gt findChild lt QPushButton gt 34
  • linux下zip加密压缩和解压

    对于目录a的无密码压缩 xff1a zip r aa zip aa 对于目录a的无密码j解压 xff1a unzip aa zip 对于目录a的加密压缩 xff0c 密码为123456 xff1a zip rP 123456 a zip a
  • SESSION 的数据保存在哪里呢?

    SESSION 的数据保存在哪里呢 xff1f 当然是在服务器端 xff0c 但不是保存在内存中 xff0c 而是保存在文件或数据库中 默认情况下 xff0c php ini 中设置的 SESSION 保存方式是 files xff08 s
  • 在ubuntu20.04安装vscode

    在PC上安装 照以下步骤在Ubuntu 20 04上安装VS Code xff1a 打开终端 添加Microsoft的软件包存储库到APT包管理器中 xff0c 输入以下命令 xff1a curl https packages micros
  • 有两个以上的USB设备,他们的Vendor ID和Product ID都一样,如何指定对应的usb插口和/dev/ttyUSB的序号?

    如果有两个以上的USB设备 xff0c 他们的Vendor ID和Product ID都一样 xff0c 那么无法通过Vendor ID和Product ID来区分它们 需要采取其他方式来指定对应的USB插口和 dev ttyUSB的序号
  • Could not find a configuration file for package “OpenCV“ that is compatible with requested version “

    错误详情 xff1a Could not find a configuration file for package 34 OpenCV 34 that is compatible with requested version 34 3 0
  • 在ubuntu安装c++版本的absl库

    对于 C 43 43 xff0c 您可以通过以下步骤安装 absl xff1a 1 安装必要的依赖项 xff1a sudo apt get install cmake g 43 43 git 2 克隆 absl 代码库 xff1a git
  • 一个带有信号量的列表,有什么作用

    一个带有信号量的列表可以用于在多线程环境下实现线程间的同步和通信 具体来说 xff0c 它可以实现以下功能 xff1a 1 限制列表的大小 xff1a 通过设置列表的最大容量 xff0c 可以限制列表中元素的数量 xff0c 避免列表过大导
  • TR069是什么鬼

    一 xff0c TR069是什么 1 xff0c 概念 搞嵌入式或通信设备的 xff0c 或多或少都会听说TR069 那他是什么鬼 xff1f TR069 xff0c 就是CPE广域网管理协议 它用于ACS和CPE之间的自动协商交互 xff
  • 为 Konsole 单独设置暗色主题

    在 KDE 中设置亮色主题后 xff0c konsole 主体的黑色的 xff0c 但是菜单栏是白色的 对于终端 xff0c 我更偏向于使用暗色主题 xff0c 有以下思路 xff1a KWin Rule修改 konsole 配置文件命令行
  • 2019年年终总结(流水账)

    2019年年终总结 流水账 前言 马上就要是2020年了 xff0c 我此时敲下我的第一篇年终总结 马上就要过去的2019年对于我来说是平凡但却不平淡的一年 xff0c 这一年里我经历了很多 xff0c 虽然这些在别人眼中可能是微不足道的
  • 融资租赁与经营租赁的区别

    我现在手上项目的客户是一家销售公司 xff0c 他们有把自己的商品租赁给别的公司经营的业务 于是就有了上面的融资租赁与经营租赁 xff0c 这两种方式在财务上对资产的处理是不一样的 下面我们来看看这个场景 xff1a A公司把资产租给B公司
  • 【Linux系统编程(十四)】生产者和消费者问题

    文章目录 生产者和消费者1 代码示例 生产者和消费者 生产者消费者问题 xff08 英语 xff1a Producer consumer problem xff09 xff0c 也称有限缓冲问题 xff08 英语 xff1a Bounded