生产消费者模型

目录

一丶生产者消费者模型

1.生产者消费者模型的概念

2. 生产者消费者模型的特点

二丶生产消费者模型应用

1.生产消费者模型基于阻塞队列的实现

2.实现


一丶生产者消费者模型

1.生产者消费者模型的概念

        在现实生活中,当我们缺少某些生活用品时,就会到超市去购买。当你到超市时,你的身份就是消费者,那么这些商品又是哪里来的呢,自然是供应商,那么它们就是生产者,而超市在生产者与消费者之间,就充当了一个交易场所。正是这样的方式才使得人类的交易变得高效,生产者只需要向超市供应商品,消费者只需要去超市购买商品;

        生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。这个阻塞队列就是用来给生产者和消费者解耦的。

 

2. 生产者消费者模型的特点

我们将其总结为321原则:3种关系、2个角色和1个场所

3种关系:

  1. 生产者VS生产者 --- 两者是互斥关系
  2. 消费者VS消费者 --- 两者是互斥关系
  3. 生产者VS消费者 --- 两者是同步+互斥关系

2个角色:生产者和消费者

1个场所:通常指的是内存中的一个缓冲区,用于数据交互
 

二丶生产消费者模型应用

1.生产消费者模型基于阻塞队列的实现

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在FreeRTOS中,实现生产者消费者模型有多种方法,其中一种可能的实现方式如下: 1. 创建一个生产者任务和一个消费者任务。 2. 创建一个信号量或者一个消息队列。生产者任务等待信号量或者向消息队列发送消息,消费者任务从信号量或者消息队列中获取消息。 3. 在生产者任务中,生成数据并向信号量或者消息队列发送数据。 4. 在消费者任务中,从信号量或者消息队列中获取数据,并进行处理。 下面是一个简单的示例: ```c #include "FreeRTOS.h" #include "task.h" #include "semphr.h" SemaphoreHandle_t xSemaphore; void vProducerTask(void *pvParameters) { int data = 0; while (1) { // 生产数据 data++; // 往信号量中发送数据 xSemaphoreGive(xSemaphore); vTaskDelay(pdMS_TO_TICKS(1000)); // 延时1s } } void vConsumerTask(void *pvParameters) { int data; while (1) { // 等待信号量 xSemaphoreTake(xSemaphore, portMAX_DELAY); // 从信号量中获取数据 data++; // 处理数据 } } void vTaskCreateAndStart(void) { // 创建信号量 xSemaphore = xSemaphoreCreateBinary(); // 创建生产者任务 xTaskCreate(vProducerTask, "Producer", configMINIMAL_STACK_SIZE, NULL, 1, NULL); // 创建消费者任务 xTaskCreate(vConsumerTask, "Consumer", configMINIMAL_STACK_SIZE, NULL, 1, NULL); // 启动调度器 vTaskStartScheduler(); } int main(void) { // 创建任务并启动调度器 vTaskCreateAndStart(); return 0; } ``` 在这个示例中,生产者任务每隔1秒钟生产一个数据,并将数据发送到信号量中;消费者任务等待信号量,并从信号量中获取数据,并进行处理。需要注意的是,在FreeRTOS中,使用信号量或者消息队列时需要注意线程安全问题,以避免出现竞争条件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值