生产者消费者
生产者-消费者问题
核心概念
生产者-消费者问题是一个经典的多线程同步模型,描述两类线程(生产者和消费者)通过共享缓冲区协作的过程:
- 生产者:生成数据并放入缓冲区
- 消费者:从缓冲区取出数据并处理
- 缓冲区:固定容量的共享队列(需线程安全)
关键挑战
- 缓冲区同步:
- 缓冲区满时,生产者必须等待
- 缓冲区空时,消费者必须等待
- 线程安全:防止多个线程同时修改缓冲区导致数据错误
解决方案(使用信号量)
#include <pthread.h>
#include <semaphore.h>
#define BUFFER_SIZE 10
sem_t empty; // 空槽位数量(初始=缓冲区大小)
sem_t full; // 满槽位数量(初始=0)
pthread_mutex_t mutex; // 互斥锁
int buffer[BUFFER_SIZE];
int in = 0, out = 0;
// 生产者线程
void* producer(void* arg) {
while (1) {
int item = produce_item(); // 生产数据
sem_wait(&empty); // 等待空槽位
pthread_mutex_lock(&mutex); // 进入临界区
buffer[in] = item; // 放入缓冲区
in = (in + 1) % BUFFER_SIZE;
pthread_mutex_unlock(&mutex);
sem_post(&full); // 增加满槽位
}
}
// 消费者线程
void* consumer(void* arg) {
while (1) {
sem_wait(&full); // 等待满槽位
pthread_mutex_lock(&mutex); // 进入临界区
int item = buffer[out]; // 取出数据
out = (out + 1) % BUFFER_SIZE;
pthread_mutex_unlock(&mutex);
sem_post(&empty); // 增加空槽位
consume_item(item); // 消费数据
}
}
关键机制说明
-
信号量(Semaphore):
empty:控制生产者可用槽位(初始=缓冲区容量)full:控制消费者可用数据(初始=0)
-
互斥锁(Mutex):
- 保护缓冲区操作(
in/out指针修改)的原子性
- 保护缓冲区操作(
-
等待/唤醒机制:
sem_wait():资源不足时阻塞线程sem_post():释放资源并唤醒等待线程
典型应用场景
- 消息队列系统(如Kafka、RabbitMQ)
- 任务调度池(线程池任务分配)
- 数据流水线处理(图像/视频处理框架)
- 打印任务队列
注意:现代编程语言通常提供高级封装(如Java的
BlockingQueue、Python的queue.Queue),可直接使用线程安全队列,简化实现。
华为尧权:助力运营商从能源消费者到能源消费者、生产者和使能者
表示,过去运营商是单一的能源消费者,在未来运营商是能源的消费者,也会成为能源生产者和使能者, 实现绿色转型的同时,可作为的空间更大,机会更多。
2023-07-02 22:25:01
【每日一练】第九节:生产者消费者问题
本视频为【每日一练】的第9节学习视频,注:刚开始学习的童鞋请从第一节视频开始打卡哦(本节视频在下面打卡即可)学习任务:1、生产着消费者模型,需要几个信号量(简答)打卡规则详见:第二期【每日一练】来啦,16天入门RT-
一个自定义菜单加生产者消费者循环问题
emmm 现在我是想实现一下就是根据自定义菜单的选择来跳转到不同的功能模块上 然后之前是生产者消费者模式自己没搞好 导致容易死循环 改了程序框图后就没事了 现在是希望菜单选择退出或者界面上按停止按钮
用默认密码当心变肉鸡!13条消费者物联网设备必须遵循的安全实务准则
最近读AWS的物联网安全白皮书时,看到了这篇英国文化、媒体和体育部(Department for Culture,Media and Sport,DCMS)发布的《消费者物...
资料下载
杜喜喜
2022-02-07 11:41:04
Labview生产者消费者模式—仅成功传递了一次数据怎么办
设计了一个对仪器闭环反馈的程序:一、程序框架包括:仪器初始化模块、生产者消费者模块二、仪器初始化模块(VI0)使仪器启动,由DAQ助手采集数据并处理,由生产者
labview-生产者数据不能写入队列中
各位大神,麻烦问一下,用生产者消费者模式的时候,高亮执行过程,生产者中元素能够写入队列中,但是一直接运行,数据就无法写入队列了,这是为什么呢?
如何选择在回调函数中提交的哪一个消费者?
你好,我想建立一个多通道DMA,一个生产者多用户手动模式。如何选择在回调函数中提交的哪一个消费者?生产商:CYU-U3PYPIB SOCKET0
生产者消费者结构中使用了事件结构,但是控件要按两下才能有效
生产者消费者结构中使用了事件结构,但是布尔或者数值输入控件要按两下才能运行该事件结构下的内容,请问是问什么?是不是生产者
换一换
- 如何分清usb-c和type-c的区别
- 中国芯片现状怎样?芯片发展分析
- vga接口接线图及vga接口定义
- 芯片的工作原理是什么?
- 华为harmonyos是什么意思,看懂鸿蒙OS系统!
- 什么是蓝牙?它的主要作用是什么?
- ssd是什么意思
- 汽车电子包含哪些领域?
- TWS蓝牙耳机是什么意思?你真的了解吗
- 什么是单片机?有什么用?
- 升压电路图汇总解析
- plc的工作原理是什么?
- 再次免费公开一肖一吗
- 充电桩一般是如何收费的?有哪些收费标准?
- ADC是什么?高精度ADC是什么意思?
- EDA是什么?有什么作用?
- dtmb信号覆盖城市查询
- 苹果手机哪几个支持无线充电的?
- type-c四根线接法图解
- 华为芯片为什么受制于美国?
- 怎样挑选路由器?
- 元宇宙概念股龙头一览
- 锂电池和铅酸电池哪个好?
- 什么是场效应管?它的作用是什么?
- 如何进行编码器的正确接线?接线方法介绍
- 虚短与虚断的概念介绍及区别
- 晶振的作用是什么?
- 大疆无人机的价格贵吗?大约在什么价位?
- 苹果nfc功能怎么复制门禁卡
- 单片机和嵌入式的区别是什么
- amoled屏幕和oled区别
- 复位电路的原理及作用
- BLDC电机技术分析
- dsp是什么意思?有什么作用?
- 苹果无线充电器怎么使用?
- iphone13promax电池容量是多少毫安
- 芯片的组成材料有什么
- 特斯拉充电桩充电是如何收费的?收费标准是什么?
- 直流电机驱动电路及原理图
- 传感器常见类型有哪些?
- 自举电路图
- 通讯隔离作用
- 苹果笔记本macbookpro18款与19款区别
- 新斯的指纹芯片供哪些客户
- 伺服电机是如何进行工作的?它的原理是什么?
- 无人机价钱多少?为什么说无人机烧钱?
- 以太网VPN技术概述
- 手机nfc功能打开好还是关闭好
- 十大公认音质好的无线蓝牙耳机
- 元宇宙概念龙头股一览