首页
学习
活动
专区
圈层
工具
发布
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    04 环形队列

    04 环形队列 上一章说到的数组模拟队列存在的问题,问题分析并优化 目前数组使用一次就不能用,没有达到复用的效果 将这个数组使用算法,改进成一个环形的队列 1.数组模拟环形队列 对前面的数组模拟队列的优化...因此将数组看做是一个环形的。(通过去模的方式来实现即可) 分析说明: 尾索引的下一个为头索引时,表示队列满。...即将队列容量空出一个作为约定,这个在做判断队列满的时候需要注意(rear+1)%maxsize==front 满 rear==front 空 实现思路如下: front指针含义调整,front指向队列第一个元素...也就是array[front]就是队列的第一个元素。front初始值=0。 rear变量的含义调整,rear指向队列的最后一个元素的后一个位置。因为希望空出一个空间作为约定。rear初始值=0。...(为什么要取模,因为是环形同时有rear可能是最大的然后跑到最前面来;假如:rear=1,front=0,maxsize=10 再套入公式中 (1+10-0)%10=1 有效数据为1) 2.代码实现 public

    66220

    go 环形队列

    环形队列 队列又称为“先进先出”(FIFO)线性表,限定只能在队尾插入,在队首删除 顺序队列:顺序存储结构,数组 链队列:链表结构。...内存上并没有环形的结构,因此环形队列实际上是数组的线性空间来实现的。 当数据到了尾部该如何处理呢?...它将转回到原来位置进行处理,通过取模操作来实现 golang环形队列实现 什么是环形队列 如图所示,一个环形队列.含有二个指针: 队列头指针,队列尾指针....实现环形队列图示过程 初始化一个数组大小为6的环形队列, 头指针front=0, 尾指针rear=0, 刚好front=rear =0的状态,表示环形队列为空. 2.向环形队列里插入1个元素,则rear...// 环形队列 type CircleQueue struct { length int // 队列长度 head int // 指向队列首 0 tail int // 指向队列尾

    1.5K20

    稀疏数组 & 环形队列

    二、环形队列 1、普通队列存在什么问题?...队列大家都知道,有几个重要的属性: rear:指向队列的尾巴,即最后一个元素所在的位置,初始值为-1 front:指向队列的头部的前一个位置,初始值也为-1 capacity:队列的容量 空队列的rear...这时队列明明是空的,但是却不能再入队元素的,因为满足rear = capacity - 1,也就是相当于这队列是一次性的,用过之后就不能再用了,即使为空也不能再入队了,造成空间的浪费,所以环形队列就出现了...2、环形队列实现思路: 环形队列中的几个重要属性: rear:指向队列尾巴的后一个位置,初始值为0 front:指向队列的头部,即第一个元素所在的位置,初始值为0 capacity:队列的容量 下面是环形队列的一些算法...入队操作时:rear = (rear + 1) % capacity 出队操作时:front = (front + 1) % capacity; 判断队列是否已满是环形队列中最重要也是最难理解的地方

    78120

    【Linux】基于环形队列的生产消费者模型

    一、POSIX信号量 1、概述 在我们进行环形队列的生产消费者模型的学习之前,我们要对前置条件POSIX信号量进行学习,这里的POSIX的信号量与systemV的信号量是几乎一致的,都是用于同步操作,达到无冲突的访问共享资源的目的...我们在之前应该都接触过环形队列,在环形队列中,一般我们是需要一个计数器的,或者在环形队列中留出最后一个位置,因为如果没有这些措施,我们就不知道双指针谁在前谁在后了,我们这里使用信号量替代了这个计数器...二、基于环形队列的生产消费者模型 1、理论探究 我们通过数组以及模运算的方式来模拟环状模型,前面的基于阻塞队列的生产消费者模型底层来说是基于容器queue的,其空间可以动态分配,现在是基于固定大小的...,基于容器vector 其中生产者关注的是环形队列的空间资源,消费者关心的是环形队列的数据资源,而环形队列中的空间资源+数据资源=全部资源,只要有空间生产者就可以生产数据然后放入,只要有数据消费者就可以取出数据然后加工...const static int defaultcap = 8; //环形队列核心接口:PV操作以及加锁解锁 template class RingQueue{ private:

    36200

    4-1-关于环形队列

    现在看看实际的 1.环形队列管理程序 ?...3.通过环形队列函数往数组里面存数据 ? ? ? 4.通过环形队列函数往数组里面存数据 ? 5.取出来几个数据 ? ? 咱存储数据的时候存储的顺序是 1,2,3,4,5,6依次存进去的....其实黄框位置在环形队列管理函数里面认为是空位置. 现在看典型应用 1,说明 首先环形队列适用于很多场合,尤其是一边存数据一边处理数据的场合. 2.使用环形队列缓存串口数据 ? ? ?...我的所有的项目都是使用的环形队列做数据处理..../yangfengwu/p/14620102.html 4.用户只需要知道,环形队列就是一个缓存数据的方式 此节代码中还有使用中断发送数据,缓存也是使用的环形队列 其实就是把数据放到环形队列,然后打开中断发送

    65630

    【Linux】生产消费模型实践 --- 基于信号量的环形队列

    --- 何炅 --- 基于信号量的环形队列 1 信号量 2 框架构建 3 代码实现 4 测试运行 1 信号量 信号量本质是一个计数器,可以在初始化时对设置资源数量,进程 / 线程 可以获取信号量来对资源进行操作和结束操作可以释放信号量...信号量销毁: #include int sem_destroy(sem_t *sem); 2 框架构建 环形队列的成员变量 线性容器vector模拟环形队列 最大容量...: 在环形队列的实现中,没有使用条件变量,像阻塞队列一样进行条件的判断 而是直接来不管三七二十一进行获取信号量,因为信号量本身就是判断条件,信号量是用来描述内部资源的多少的,是原子的!...在该测试中:定义了两个线程函数Consumer和Productor,分别模拟消费者和生产者行为: Consumer线程不断从环形队列中取出Task对象,执行其操作,并打印消费结果。...通过这种方式,我们验证了环形队列在多线程环境下的线程安全性和功能正确性。

    42810

    数据结构之环形队列

    数组模拟环形队列 对前面的数组模拟队列的优化,充分利用数组,因此将数组看做是一个环形的。...(通过取模的方式来实现即可) 分析说明: 尾索引的下一个为头索引时表示队列满,即将队列容量空出一个作为约定,这个在做判断队列满的时候需要注意 (rear + 1) % maxSize == front...System.out.println("g(get):从队列取出数据"); System.out.println("h(head):查看队列头的数据")...: * front 变量的含义做一个调整: front 就指向队列的第一个元素, * 也就是说 arr[front] 就是队列的第一个元素,front 的初始值 = 0 *...*/ private int front; /** * 队列尾: * rear 变量的含义做一个调整:rear 指向队列的最后一个元素的后一个位置

    33510

    【Linux】互斥锁、基于阻塞队列、环形队列的生产消费模型、单例线程池

    Linux上提供的这把锁叫互斥量。 | 线程或进程什么时候被切换?...// int _cwait; //有多少个消费者在阻塞等待 // int _pwait; //有多少个生产者在阻塞等待 // }; } 2.2 环形队列...对于环形队列,重要的一点是为空或为满,指针指向的是同一个位置。...》:前面的阻塞队列中不管是生产还是消费前都要先判断,为什么环形队列这里没有判断呢? 因为这里信号量本身就是表示资源数目,只要成功,就一定有,不需要判断。...而我们知道环形队列中读写位置各自只有一个,所以多线程之间的生产和消费最后还是单生产单消费问题,所以我们只需要用两把锁,一把锁守护生产权利,一把锁守护消费权利,让多线程先竞争这把锁,然后生产或消费。

    42500

    go语言数据结构 环形队列

    1.环形队列是什么 队列是一种常用的数据结构,这种结构保证了数据是按照“先进先出”的原则进行操作的,即最先进去的元素也是最先出来的元素.环形队列是一种特殊的队列结构,保证了元素也是先进先出的,但与一般队列的区别是...C代码实现见:https://github.com/dodng/fast_ring_queue 2.环形队列的优点   1.保证元素是先进先出的 是由队列的性质保证的,在环形队列中通过对队列的顺序访问保证...在最典型的生产者消费者模型中,如果引入环形队列,那么生成者只需要生成“东西”然后放到环形队列中即可,而消费者只需要从环形队列里取“东西”并且消费即可,没有任何锁或者等待,巧妙的高效实现了多线程数据通信。...3.环形队列的工作场景 一般应用于需要高效且频繁进行多线程通信传递数据的场景,例如:linux捕包、发包等等,(linux系统中对PACKET_RX_RING和PACKET_TX_RING的支持实质就是内核实现的一种环形队列...4.3元素状态切换 有种很巧妙的方法,就是在队列中每个元素的头部加一个元素标示字段,标示这个元素是可读还是可写,而这个的关键就在于何时设置元素的可读可写状态,参照linux内核实现原理,当这个元素读取完之后

    2K30

    丢给你个环形队列玩玩

    一,其实环形队列就是利用一些函数把一个数组的首位连接起来,然后实现如下功能 环形队列的存在解决了一个最典型的问题: 假设我需要处理10000个字节的数据,就是串口一次性会发过来10000个字节,然后单片机每次取...利用环形队列的话,我可以定义一个20字节的数组,串口中断里面不停的往里面存数据,我主循环不停的查询这个数组里面是否够10字节了, 如果够了,我就从里面取出来10字节处理,然后不停的循环....三,创建一个数组   创建一个环形队列管理变量  然后把数组交给环形队列函数去管理 ? ? ? 四,把数据写入环形队列 ? 五,读出数据,输出每10个数据的累加和  ? ?...如果环形队列满了,这个标志位将置位 处理数据的时候判断一下这个标志位是否置位,如果置位说明本次的数据有丢失!

    58350

    【Linux】生产者消费者模型——环形队列RingQueue(信号量)

    引入环形队列 环形队列之前我们就了解过了,只要是环形队列,就存在判空判满的问题。...实际上并不是真正的环形队列,而是通过数组模拟的,当数据加入到最后的位置时直接模等于数组的大小即可。...访问环形队列 生产者和消费者访问同一个位置的情况:空的时候,满的时候;其他情况下生产者与消费者访问的就是不同的区域了。...大部分情况下生产者与消费者是并发执行的,但是当环形队列为空或为满的时候就会存在着同步与互斥问题。...],nullptr); for(int i = 0 ;i<8;i++) pthread_join(c[i],nullptr); return 0; } 总结 多生产多消费的意义:不管是环形队列还是阻塞队列

    74140

    【Linux】生产者消费者模型:基于阻塞队列和环形队列 | 单例模式线程池

    阻塞队列就是生产者和消费者的共享容器,生产者是从数据到阻塞队列中,消费者从阻塞队列中拿数据。...需要注意的是: 当阻塞队列为空时,消费者不可以从阻塞队列中拿数据,此时消费者进入条件变量队列下等待,当消费了一个数据,就可以唤醒一个生产者生产了 当阻塞队列满时,生产者不可以向阻塞队列中生产数据,此时生产者进入条件变量队列下等待...mutex; //锁 pthread_cond_t _c_cond; //消费者的条件变量 pthread_cond_t _p_cond; //生产者的条件变量 }; 四.基于环形队列的生产者消费者模型...int sem_post(sem_t *sem);//V() 环形队列 当环形队列为空或为满时,生产者和消费者才会相遇 消费者不能超过生产者,生产者不能超过消费者一个圈  生产者关心的是还剩多少剩余空间...linux中也有一批关于自旋锁的接口:  用法都和互斥锁的类似。

    67710

    柔性数组和环形队列之间的故事

    刚好,之前发关于环形队列的文章有些问题,这次刚好拿出来一起说一下,并用柔性数组实现一个环形队列。...柔性数组的上一篇文章 环形队列C语言实现文章 1、环形队列文章之前的代码有bug /*插入数据*/ int ring_buff_insert(struct ring_buff * p_ring_buff...4、使用柔性数组实现环形队列 /* 实现的最简单的ringbuff 有更多提升空间,可以留言说明 */ #include "stdio.h" #include "stdlib.h" #include "...time.h" #define LEN 64 typedef int datatype; /*环形队列结构体*/ typedef struct ring_buff{ int W;...*/ int get_ring_buff_fullstate(struct ring_buff * p_ring_buff) { /*如果写位置减去读位置等于队列长度,就说明这个环形队列已经满*

    86240

    【Linux】:多线程(POSIX 信号量 、基于环形队列的生产消费者模型)

    POSIX 信号量 和 System V 信号量 是两种实现信号量的机制,都用于进程或线程间的同步,但它们在实现细节、功能和使用方式上存在显著差异 之前 System V 信号量我们在这篇博客里 【Linux...】 IPC 进程间通信(三)(消息队列 & 信号量) 说过 1....基于环形队列的生产消费模型 2.1 基本思想 环形队列采用数组模拟,用模运算来模拟环状特性 环形结构起始状态和结束状态都是一样的,不好判断为空或者为满,所以可以通过加计数器或者标记位来判断满或者空...另外也可以预留一个空的位置,作为满的状态 实现思想: 默认:为空 或 为满,指向同一个位置 环形队列中存取的资源 应该是 空间(初始 N ) 和 数据 (初始 0) 我们把 空间 和 数据看作两个信号量...勉励 【*★,°*:.☆( ̄▽ ̄)/$:*.°★* 】那么本篇到此就结束啦,如果有不懂和发现问题的小伙伴可以在评论区说出来哦,同时我还会继续更新关于【Linux】的内容,请持续关注我 !!

    69710

    来看看加入环形队列的串口发送数据

    一,为什么要使用环形队列来发送数据?是为了解决什么问题呢! ? 这节说了怎么用中断发送数据,但是大家是否想过,这种中断发送有个bug,看一下下面的 ? ?...直接利用环形队列是很好的选择. 我把发送的数据写入环形队列,然后打开串口发送中断 串口发送中断里面判断环形队列里面的数据个数是不是大于0,如果是就读出来发出去! 二,定义一些变量 ? ? ? ?...三,然后把数组交给 环形队列变量去管理 ? 四,串口发送中断里面就是这样 ? 五,修改一下环形队列的一个函数,填充完数据就打开中断 ? 六,现在测试 ? ? 现在的数据不会出现丢失!...注意:即使是使用了环形队列也不要在主循环里面 ? 环形队列缓存也有限! 只要波特率定好了,中断发送每一位数据的时间是一定的,发送数据就一定需要时间! 现在是直接造成死机, ?...其实造成死机的原因是因为环形队列里面使用的printf, ? 而printf 并不是中断发送,造成了冲突 ? 改一下 ? ?

    2.4K20
    领券