生产消费者模型-环形队列与信号量

news2024/12/22 15:31:45

文章目录

  • 前言
  • 一、怎样的环形队列?
  • 二、什么是信号量
  • 三、使用步骤
    • 信号量的接口函数
      • 1. sem_init
      • 2.sem_destroy
      • 3.sem_wait
      • 4.sem_post
    • 环形队列的设计
    • 测试用例


前言

之前我们使用互斥锁和条件变量实现过一个生产者消费者模型,那么那个生产消费者模型具有一个缺点那就是只能串形生产与消费。

在某些环境与需求下,我们可以拥有比较大的数据空间,且我们的数据是批次分布在该空间中,我们是否可以让生产与消费并行呢?
通过环形队列我们其实是可以实现的,并且我们本次学习尝试学习认识和如何使用信号量。


一、怎样的环形队列?

这里我们通过例如vector的数组来模拟出环形队列,通过下标%vector.size(),就可以模拟出环形队列。
在这里插入图片描述

二、什么是信号量

信号量的本质其实就是一个计数器,他分别具有P操作和V操作,其中P操作可以简单的理解为计数器–,V操作可以简单的理解为计数器++。

而他最重要的就在于信号量的接口操作函数都是原子性的,是线程安全的。

在本次的生产消费者模型中,就充当着可用空间计数和有效数据计数。

三、使用步骤

信号量的接口函数

1. sem_init

在这里插入图片描述
该函数用于初始化信号量,其中参数pshared若为0,则不在线程之间共享,参数value则为信号量计数器的初始计数。

2.sem_destroy

在这里插入图片描述
销毁信号量。

3.sem_wait

在这里插入图片描述
代表着信号量的P操作,也就是让该信号量计数器–。

4.sem_post

在这里插入图片描述
代表着信号量的V操作,也就是让该信号量计数器++。

我们再把信号量进行包装一下

#include<semaphore.h>

class Sem{
public:
    Sem(unsigned int value)
    {
        sem_init(&_sem,0,value);
    }

    void p()
    {
        sem_wait(&_sem);
    }

    void v()
    {
        sem_post(&_sem);
    }
    ~Sem()
    {
        sem_destroy(&_sem);
    }
private:
    sem_t _sem;
};

环形队列的设计

#include<iostream>
#include<vector>
#include"semaphore.hpp"
#define DEFAULT_NUM 5 
template<class T>
class ringQueue{
    public:
    ringQueue(int default_num = DEFAULT_NUM)
    :_queue(default_num)
    ,c_step(0)
    ,p_step(0)
    ,data_sem(0)
    ,space_sem(default_num)
    {}

    void push(T& data)
    {
        space_sem.p();
        _queue[p_step++] = data;
        p_step %= _queue.size();
        data_sem.v();
    }

    void pop(T* data)
    {
        data_sem.p();
        *data = _queue[c_step++];
        c_step %= _queue.size();
        space_sem.v();
    }
    private:
    std::vector<T> _queue;
    int c_step;
    int p_step;
    Sem data_sem;
    Sem space_sem;
};

测试用例

#include"ringQueue.hpp"
#include<time.h>
#include<stdlib.h>
#include<unistd.h>
void* productor(void* args)
{
    ringQueue<int>* ring_queue = (ringQueue<int>*)args;
    while(1)
    {   
        int data = rand() % 100 + 1;
        ring_queue->push(data);
        std::cout << "生产者已生产数据: " << data << std::endl; 
        //sleep(1);
    }

}

void* consumer(void* args)
{
    ringQueue<int>* ring_queue = (ringQueue<int>*)args;
    while(1)
    {
        int data;
        ring_queue->pop(&data);
        std::cout << "消费者已消费数据: " << data << std::endl; 
        sleep(1);
    }
}



int main()
{
    srand((size_t)time(nullptr)^ getpid());
    ringQueue<int> ring;
    pthread_t p1;
    pthread_t p2;
    pthread_create(&p1,nullptr,productor,(void*)(&ring));
    pthread_create(&p2,nullptr,consumer,(void*)(&ring));
    

    pthread_join(p1,nullptr);
    pthread_join(p2,nullptr);
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1676957.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Github20K星开源团队协作工具:Zulip

Zulip&#xff1a;让团队协作的每一次交流&#xff0c;都精准高效。- 精选真开源&#xff0c;释放新价值。 概览 随着远程工作的兴起和团队协作的需求不断增加&#xff0c;群组聊天软件成为了日常工作中不可或缺的一部分。Zulip 是github上一个开源的团队协作工具&#xff0c;…

【问题实操】银河高级服务器操作系统实例分享,网卡drop问题分析

1.服务器环境以及配置 系统环境 物理机/虚拟机/云/容器 物理机 网络环境 外网/私有网络/无网络 私有网络 硬件环境 机型 华鲲振宇 TG225B1 处理器 kunpeng 920 内存 1024GB 主板型号 TG225B1 HZKY 整机类型/架构 aarch64 固件版本 6.57 软件环境 具体操作系…

谷歌Gemini时代来了!加固搜索护城河、赋能全家桶,Gemini 1.5 Pro升级至200万token

3 月中旬&#xff0c;谷歌宣布 Google I/O 定档北京时间 5 月 15 日凌晨 1 点。而当大会开幕时间临近&#xff0c;本应是讨论度最高的时候&#xff0c;「宿敌」OpenAI 却半路杀出&#xff0c;抢先一天&#xff0c;仅耗时 27 分钟就发布了颠覆性巨作 GPT-4o&#xff0c;将新一轮…

HTTP代理可以应用在那些领域呢

HTTP代理是IP代理领域中一个重要组成部分&#xff0c;它基于HTTP协议传输&#xff0c;使用海外服务器帮助用户绕开访问限制&#xff0c;浏览查看海外资讯信息。 HTTP代理可以应用在哪些领域呢&#xff1f; 1.保护使用者隐私 当今越来越数据被上传到网络云端上&#xff0c;用户…

Gone框架介绍17 - 创建一个可运行在生产环境的Web项目

gone是可以高效开发Web服务的Golang依赖注入框架 github地址&#xff1a;https://github.com/gone-io/gone 文档原地址&#xff1a;https://goner.fun/zh/guide/auto-gen-priest.html 请帮忙在github上点个 ⭐️吧&#xff0c;这对我很重要 &#xff1b;万分感谢&#xff01;&a…

【爬虫之scrapy框架——尚硅谷(学习笔记two)--爬取电影天堂(基本步骤)】

爬虫之scrapy框架--爬取电影天堂——解释多页爬取函数编写逻辑 &#xff08;1&#xff09;爬虫文件创建&#xff08;2&#xff09;检查网址是否正确&#xff08;3&#xff09;检查反爬&#xff08;3.1&#xff09; 简写输出语句&#xff0c;检查是否反爬&#xff08;3.2&#x…

Nginx生产环境最佳实践之配置灰度环境

你好呀&#xff0c;我是赵兴晨&#xff0c;文科程序员。 下面的内容可以说是干货满满建议先收藏再慢慢细品。 今天&#xff0c;我想与大家深入探讨一个我们日常工作中不可或缺的话题——灰度环境。你是否在工作中使用过灰度环境&#xff1f;如果是&#xff0c;你的使用体验如…

flutter开发实战-compute将工作交由isolate处理

flutter开发实战-compute将工作交由isolate处理 最近查看flutter文档时候&#xff0c;看到了compute可以将工作交由isolate处理。通过 Flutter 提供的 compute() 方法将解析和转换的工作移交到一个后台 isolate 中。这个 compute() 函数可以在后台 isolate 中运行复杂的函数并…

Leetcode 第 129 场双周赛题解

Leetcode 第 129 场双周赛题解 Leetcode 第 129 场双周赛题解题目1&#xff1a;3127. 构造相同颜色的正方形思路代码复杂度分析 题目2&#xff1a;3128. 直角三角形思路代码复杂度分析 题目3&#xff1a;3129. 找出所有稳定的二进制数组 I思路代码复杂度分析 题目4&#xff1a;…

JavaScript异步编程——11-异常处理方案【万字长文,感谢支持】

异常处理方案 在JS开发中&#xff0c;处理异常包括两步&#xff1a;先抛出异常&#xff0c;然后捕获异常。 为什么要做异常处理 异常处理非常重要&#xff0c;至少有以下几个原因&#xff1a; 防止程序报错甚至停止运行&#xff1a;当代码执行过程中发生错误或异常时&#x…

数字人解决方案——ID-Animator可保持角色一致生成视频动画

一、引 言 个性化或自定义生成在图像和视频生成领域是一个不断发展的研究方向&#xff0c;尤其是在创建与特定身份或风格一致的内容方面。您提到的挑战和解决方案为这一领域提供了有价值的见解&#xff1a; 训练成本高&#xff1a;这是一个普遍问题&#xff0c;因为个性化生成…

手机触控面板中应用的电容式触摸芯片

手机触控屏&#xff08;Touch panel&#xff09;又称为触控面板&#xff0c;是个可接收触头等输入讯号的感应式液晶显示装置&#xff0c;当接触了屏幕上的图形按钮时&#xff0c;屏幕上的触觉反馈系统可根据预先编程的程式驱动各种连结装置&#xff0c;可用以取代机械式的按钮面…

【AI】DeepStream(03):deepstream_test1_app

1、简介 deepstream-test1:演示各种 DeepStream 插件构建 GStreamer 管道。从文件中获取视频、解码、批处理,然后进行对象检测,最后在屏幕上渲染框。 源码路径:/opt/nvidia/deepstream/deepstream/sources/apps/sample_apps/deepstream-test1 先看下效果 2、编译 1)…

Redis-分片集群存储及读取数据详解

文章目录 Redis分片集群是什么&#xff1f;Redis分片集群的存储及读取数据&#xff1f; 更多相关内容可查看 Redis分片集群是什么&#xff1f; Redis分片集群是一种分布式部署方式&#xff0c;通过将数据分散存储在多个Redis节点上&#xff0c;从而提高了系统的性能、扩展性和…

【微记录】linux内核态日志如何持续观测?以及dmesg如何显示年月日时间戳?(dmesg -w ; -T)

文章目录 持续观测方法1方法2 dmes显示时间戳 持续观测 方法1 dmesg -w参考&#xff1a;https://man7.org/linux/man-pages/man1/dmesg.1.html 方法2 tail -f /var/log/kern.logdmes显示时间戳 dmesg -T #按照人类可读性高的时间戳 比如2024-05-15 01:20:16实操&#xff1…

快速学习SpringAi

Spring AI是AI工程师的一个应用框架&#xff0c;它提供了一个友好的API和开发AI应用的抽象&#xff0c;旨在简化AI应用的开发工序&#xff0c;例如开发一款基于ChatGPT的对话应用程序。通过使用Spring Ai使我们更简单直接使用chatgpt 1.创建项目 jdk17 引入依赖 2.依赖配置 …

敏捷开发最佳实践:自驱团队实践案例之心情曲线回顾会

调研发现&#xff0c;26%的中国企业认为最有价值管理实践是“团队回顾会”&#xff0c;而“团队回顾会”的确能够很好的引导团队走向自驱。在本节的实践案例中 “心情曲线回顾会”的具体做法较为典型&#xff0c;很值得参考。 本实践节选自《2021中国企业敏捷实践白皮书》&…

压力给到 Google,OpenAI 发布 GPT-4o 来了

北京时间5月14日凌晨1点&#xff0c;OpenAI 开启了今年的第一次直播&#xff0c;根据官方消息&#xff0c;这次旨在演示 ChatGPT 和 GPT-4 的升级内容。在早些时候 Sam Altman 在 X 上已经明确&#xff0c;「我们一直在努力开发一些我们认为人们会喜欢的新东西&#xff0c;对我…

OpenNJet产品体验:探索无限可能

文章目录 前言一、OpenNJet是什么&#xff1f;二、OpenNJet特性和优点三、OpenNJet功能规划四、OpenNJet快速上手五、OpenNJet的使用总结 前言 现代社会网络高速发展&#xff0c;同时也迎来了互联网发展的高峰&#xff0c;OpenNJet作为一个基于NGINX的面向互联网和云原生应用提…

爬虫入门经典(七) | 采集淘宝电场相关信息

大家好&#xff0c;我是不温卜火&#xff0c;昵称来源于成语—不温不火&#xff0c;本意是希望自己性情温和。 PS&#xff1a;由于现在越来越多的人未经本人同意直接爬取博主本人文章&#xff0c;博主在此特别声明&#xff1a;未经本人允许&#xff0c;禁止转载&#xff01;&a…