登录/注册

生产者消费者

更多

生产者-消费者问题

核心概念

生产者-消费者问题是一个经典的多线程同步模型,描述两类线程(生产者和消费者)通过共享缓冲区协作的过程:

关键挑战

  1. 缓冲区同步
    • 缓冲区满时,生产者必须等待
    • 缓冲区空时,消费者必须等待
  2. 线程安全:防止多个线程同时修改缓冲区导致数据错误

解决方案(使用信号量)

#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);         // 消费数据
    }
}

关键机制说明

  1. 信号量(Semaphore)

    • empty:控制生产者可用槽位(初始=缓冲区容量)
    • full:控制消费者可用数据(初始=0)
  2. 互斥锁(Mutex)

    • 保护缓冲区操作(in/out指针修改)的原子性
  3. 等待/唤醒机制

    • sem_wait():资源不足时阻塞线程
    • sem_post():释放资源并唤醒等待线程

典型应用场景

  1. 消息队列系统(如Kafka、RabbitMQ)
  2. 任务调度池(线程池任务分配)
  3. 数据流水线处理(图像/视频处理框架)
  4. 打印任务队列

注意:现代编程语言通常提供高级封装(如Java的BlockingQueue、Python的queue.Queue),可直接使用线程安全队列,简化实现。

华为尧权:助力运营商从能源消费者到能源消费者生产者和使能者

表示,过去运营商是单一的能源消费者,在未来运营商是能源的消费者,也会成为能源生产者和使能者, 实现绿色转型的同时,可作为的空间更大,机会更多。

2023-07-02 22:25:01

【每日一练】第九节:生产者消费者问题

本视频为【每日一练】的第9节学习视频,注:刚开始学习的童鞋请从第一节视频开始打卡哦(本节视频在下面打卡即可)学习任务:1、生产着消费者模型,需要几个信号量(简答)打卡规则详见:第二期【每日一练】来啦,16天入门RT-

2021-09-01 09:48:12

一个自定义菜单加生产者消费者循环问题

emmm 现在我是想实现一下就是根据自定义菜单的选择来跳转到不同的功能模块上 然后之前是生产者消费者模式自己没搞好 导致容易死循环 改了程序框图后就没事了 现在是希望菜单选择退出或者界面上按停止按钮

2021-03-29 19:51:02

人工智能+消费:技术赋能与芯片驱动未来

电子发烧友网站提供《人工智能+消费:技术赋能与芯片驱动未来.pptx》资料免费下载

资料下载 佚名 2025-11-26 14:50:49

扩大农村生产者的生态恒温器

电子发烧友网站提供《扩大农村生产者的生态恒温器.zip》资料免费下载

资料下载 王秀兰 2023-01-30 09:35:15

《2022年全球消费者洞察调研》中国报告

《2022年全球消费者洞察调研》中国报告消费类电子

资料下载 jf_55130775 2022-11-10 15:22:29

用默认密码当心变肉鸡!13条消费者物联网设备必须遵循的安全实务准则

最近读AWS的物联网安全白皮书时,看到了这篇英国文化、媒体和体育部(Department for Culture,Media and Sport,DCMS)发布的《消费者物...

资料下载 杜喜喜 2022-02-07 11:41:04

消费者技术协会国际标准CTA-861-F

消费者技术协会国际标准CTA-861-F

资料下载 keyruan 2021-09-23 15:16:25

Labview生产者消费者模式—仅成功传递了一次数据怎么办

设计了一个对仪器闭环反馈的程序:一、程序框架包括:仪器初始化模块、生产者消费者模块二、仪器初始化模块(VI0)使仪器启动,由DAQ助手采集数据并处理,由生产者

2020-11-19 20:16:07

基于生产者消费者完整测试程序

[hide][url=]基于生产者消费者完整测试 ...[/url] [/hide]

2020-11-01 17:13:19

labview-生产者数据不能写入队列中

各位大神,麻烦问一下,用生产者消费者模式的时候,高亮执行过程,生产者中元素能够写入队列中,但是一直接运行,数据就无法写入队列了,这是为什么呢?

2020-08-15 14:56:52

生产者消费者循环的问题

如果将生产者消费者循环中的一个生产者同时对应两个消费者的时候,会有一些问

2020-03-25 10:02:50

如何选择在回调函数中提交的哪一个消费者

你好,我想建立一个多通道DMA,一个生产者多用户手动模式。如何选择在回调函数中提交的哪一个消费者?生产商:CYU-U3PYPIB SOCKET0

2019-10-21 10:48:31

labview的生产者/消费者模式

生产者/消费者模式以前在没有学习队列这块,看到生产者/消费者模式的时候总

2019-05-05 09:36:04

生产者消费者结构中使用了事件结构,但是控件要按两下才能有效

生产者消费者结构中使用了事件结构,但是布尔或者数值输入控件要按两下才能运行该事件结构下的内容,请问是问什么?是不是生产者

2019-04-28 15:23:20
7天热门专题 换一换
相关标签