Linux高阶——1116—环形队列生产者消费者

目录

1、环形队列

2、生产者消费者

环形队列数组实现代码

成功截图


1、环形队列

相比于线性队列,环形队列可以有效避免访问越界问题,使用下标访问队列元素时,到达末尾后下标归0,返回起始位置,使用下标运算即可

array[5],下标为0、1、2、3、4,下标使用(index+1)%array_len计算

环形队列构成:

1、存储容器(数组)

2、Front(头索引)——用于入队,向数组执行下标赋值

3、Rear(尾索引)——用于出队,从数组中获取资源

3、队列大小QUEUE_SIZE

4、已用大小Size

5、环形队列遍历依然采用环形遍历,尾追头

2、生产者消费者

生产者消费者模型,经典的线程同步方式,控制多个线程操作相同任务队列,实现数据传递或任务传递,部分线程添加任务,部分线程获取处理任务,当然需要线程同步技术完成协调调度

生产者用enqueue向环形队列中添加元素,消费者用dequeue从环形队列中读取数据

共享队列为互斥的,需要添加互斥锁

队列未满,生产者添加;队列非空,消费者读取

消费者满,生产者挂起;队列空,消费者挂起

生产者添加任务1次后,唤醒消费者;消费者读取一次数据成功,唤醒1次生产者

环形队列应该为函数指针数据,void*(task*)(void*)——返回值为泛型指针,传入参数为泛型,函数名为task

生产者将函数地址函数参数添加到环形队列中,消费者传参调用函数,为任务传递

环形队列数组实现代码

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<time.h>
#include<pthread.h>
#include<sys/mman.h>
#include<sys/wait.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<sys/fcntl.h>
#include<unistd.h>#define QUEUE_MAX 10pthread_mutex_t lock=PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t not_full=PTHREAD_COND_INITIALIZER;
pthread_cond_t not_empty=PTHREAD_COND_INITIALIZER;typedef struct {int * list;int Front;int Rear;int Size;int Max;
} q_t;q_t* queue_init(int Max)
{q_t* que=NULL;if((que=(q_t*)malloc(sizeof(q_t)))==NULL){   perror("Malloc failed");return NULL;}   if((que->list=(int*)malloc(sizeof(int)*Max))==NULL)
{   perror("Malloc List failed");return NULL;}bzero(que->list,sizeof(int)*Max);que->Front=0;que->Rear=0;que->Size=0;que->Max=Max;
}bool if_Empty(q_t *ptr) {return ptr->Size == 0;
}bool if_Full(q_t *ptr) {return ptr->Size == QUEUE_MAX;
}bool enqueue(q_t *ptr, int value) {if (if_Full(ptr)){return false;}ptr->list[ptr->Rear] = value;ptr->Rear = (ptr->Rear + 1) % QUEUE_MAX;ptr->Size++;return true;
}bool dequeue(q_t *ptr, int *value) {
if (if_Empty(ptr)){return false;}*value = ptr->list[ptr->Front];ptr->Front = (ptr->Front + 1) % QUEUE_MAX;ptr->Size--;return true;
}void* Customer(void* arg)
{pthread_detach(pthread_self());q_t* que=NULL;que=(q_t*)arg;pthread_mutex_lock(&lock);if(if_Empty(que)){pthread_cond_wait(&not_empty,&lock);}int value;dequeue(que,&value);pthread_mutex_unlock(&lock);printf("customer thread 0x%x,dequeue value %d\n",(int)pthread_self(),value);pthread_cond_signal(&not_full);pthread_exit(NULL);
}int producer_add(q_t* que,int value)
{pthread_mutex_lock(&lock);if(if_Full(que)){pthread_cond_wait(&not_full,&lock);}enqueue(que,value);pthread_mutex_unlock(&lock);pthread_cond_signal(&not_empty);return 0;
}int main()
{q_t* q=NULL;int value;pthread_t tids[8];q=queue_init(50);for(int i=0;i<8;i++){pthread_create(&tids[i],NULL,Customer,(void*)q);}for(int i=0;i<8;i++){int index=rand()%8-1;producer_add(q,index);}while(1)sleep(1);return 0;
}

成功截图

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

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

相关文章

学习大数据DAY61 宽表加工

目录 模型设计 加工宽表 任务调度&#xff1a; 大表 - 把很多数据整合起来 方便后续的明细查询和指标计算 模型设计 设计 建模 设计: excel 文档去编写 建模: 使用建模工具 PowerDesigner Navicat 在线画图工具... 把表结构给绘 制出来 共享\项目课工具\pd 加工宽表 数…

DBeaver MACOS 安装 并连接到docker安装的mysql

官网下载&#xff1a;Download | DBeaver Community 网盘下载&#xff1a;链接: https://pan.baidu.com/s/15fAhbflHO-AGc-uAnc3Rjw?pwdbrz9 提取码: brz9 下载驱动 连接测试 报错 null, message from server: "Host 172.17.0.1 is not allowed to connect to this M…

24首届数证杯(流量分析部分)

目录 流量分析 流量分析 1、分析网络流量包检材&#xff0c;写出抓取该流量包时所花费的秒数?(填写数字&#xff0c;答案格式:10) 3504相加即可 2、分析网络流量包检材&#xff0c;抓取该流量包时使用计算机操作系统的build版本是多少? 23F793、分析网络流量包检材&#x…

云服务器ECS经济型e实例和通用算力u1实例有啥区别?

阿里云服务器ECS经济型e实例怎么样&#xff1f;对比ECS通用算力型u1实例哪个更好&#xff1f;u1实例更好。阿里云服务器网aliyunfuwuqi.com二者均为云服务器ECS的实例规格&#xff0c;e实例是共享型云服务器&#xff0c;u1实例是独享型云服务器&#xff0c;何为共享&#xff1f…

QT中使用图表之QChart绘制柱状图

绘制条形&#xff08;柱状&#xff09;图&#xff0c;系列选择条形系列QBarSeries x轴选择条形图的种类轴QBarCategoryAxis 1、创建图表视图 //1、创建图表视图 QChartView * view new QChartView(this); //开启抗锯齿 view -> setRenderHint(QPainter::Antialiasing); …

Essential Cell Biology--Fifth Edition--Chapter one (8)

1.1.4.6 The Cytoskeleton [细胞骨架] Is Responsible for Directed Cell Movements 细胞质基液不仅仅是一种无结构的化学物质和细胞器的混合物[soup]。在电子显微镜下&#xff0c;我们可以看到真核细胞的细胞质基液是由长而细的丝交叉而成的。通常[Frequently]&#xff0c;可…

【Linux】守护进程

目录 进程组 会话 作业控制 实现守护进程 我们在写完一些网络服务后&#xff0c;如果想让这个服务一直在云服务器的后台运行着&#xff0c;那该如何实现呢&#xff1f;其实就用到了这篇博客要讲的守护进程 进程组 我们首先需要了解进程组的概念&#xff0c;其实sleep 1000这…

nginx.conf配置文件中的命令

打开我们的conf文件 nginx.conf文件中&#xff0c;分为3大块&#xff1a; 全局块&#xff0c;就是events和http块之外的内容。设置nginx服务器整体运行的指令 格式为&#xff1a; 指令名 指令值 events块&#xff0c;用于配置与用户的网络连接的内容&#xff0c;对nginx的…

51单片机基础07 实时时钟-思路及代码参考1

目录 一、实现功能 二、思路1的分析 1、定时器0 2、外部中断0 3、主函数main 4、其他重要功能函数 一、实现功能 1、实现最基本的计时功能&#xff0c;显示时、分、秒&#xff0c;可以通过按键设置时间。 要求&#xff1a;时钟计时精确&#xff0c;按键操作不影响计时。…

vTESTstudio系列15--vTESTstudio-Doors的需求和测试用例的管理

最近有朋友在咨询vTESTstudio中怎么去跟Doors里面的需求去做好管理这方面的问题&#xff0c;临时加两篇文章介绍一下,Lets Go!!! 目录 1.Doors的配置&#xff1a; 1.1 安装Doors AddIn for vTESTstudio&#xff1a; 1.2 更新XML脚本&#xff1a; 1.3 导出需求的Trace Item…

基于Java Springboot编程语言在线学习平台

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 数据…

JDK安装报错“以下应用程序正在使用需要由此安装程序更新的文件”

&#xff08;一&#xff09;问题描述 我刚刚没有截图&#xff0c;这是我在网上看到的图&#xff1a; &#xff08;二&#xff09;可能的解决办法 1. 下方工具栏右键&#xff0c;打开任务管理器按钮&#xff0c;在进程中找到“Java Platform SE binary” 进程&#xff0c;右键结…

数据库第3次作业

学生表&#xff1a;Student (Sno, Sname, Ssex , Sage, Sdept) 学号&#xff0c;姓名&#xff0c;性别&#xff0c;年龄&#xff0c;所在系 Sno为主键 课程表&#xff1a;Course (Cno, Cname,) 课程号&#xff0c;课程名 Cno为主键 学生选课表&#xff1a;SC (Sno, Cno, Score)…

Linux之文件系统,软硬连接和动静态库

Linux之文件系统&#xff0c;软硬连接和动静态库 一.文件系统1.1磁盘的存储结构1.2CHS和LBA1.3ext2文件系统 二.软硬连接2.1软链接2.2硬链接 三.静态库和动态库3.1静态库与动态库的概念3.2静态库的创建与使用3.3动态库的创建与使用3.4动态库的加载 一.文件系统 在上篇的学习中…

【项目开发】URL中井号(#)的技术细节

未经许可,不得转载。 文章目录 前言一、# 的基本含义二、# 不参与 HTTP 请求三、# 后的字符处理机制四、# 的变化不会触发网页重新加载五、# 的变化会记录在浏览器历史中六、通过 window.location.hash 操作七、onhashchange 事件八、Google 对 # 的处理机制前言 2023 年 9 月…

TikZ 绘图学习笔记

这篇笔记的所有代码如下&#xff1a; % !TEX TS-program pdflatex % !TEX encoding UTF-8 Unicode% This is a simple template for a LaTeX document using the "article" class. % See "book", "report", "letter" for other typ…

Android Framework层介绍

文章目录 前言一、Android Framework 层概述二、主要组件1. 应用程序接口&#xff08;API&#xff09;2. 系统服务3. Binder4. 资源管理5. Content Provider6. 广播接收器&#xff08;BroadcastReceiver&#xff09;7. 服务&#xff08;Service&#xff09; 三、与 Linux Kerne…

如何选择等保服务

在当今信息化高速发展的时代&#xff0c;企业信息系统已成为业务运营的核心支撑&#xff0c;其安全性直接关系到企业的生存与发展。为了应对日益复杂的网络安全威胁&#xff0c;国家推行了等级保护&#xff08;简称等保&#xff09;制度&#xff0c;作为一项基本的信息安全保障…

MCU中的定时器

第一章 定时器的应用场景 第二章 定时器的原理 2.1 定时器的计数原理 1. 定时器的本质是一个计数器&#xff1b; 2. 计数器是对输入的系统频率信号进行计数&#xff1b; 3. 每来一个周期的信号&#xff0c;计数器的cnt 加一。如果周期T表示为1s&#xff0c;来三个周期就表示…

主页任务与计算器任务

一、主页任务 /* Private includes -----------------------------------------------------------*/ //includes #include "user_TasksInit.h" #include "user_ScrRenewTask.h" #include "main.h" #include "rtc.h" #include "…