Ring Buffer原理:
环形缓冲区(ring buffer),也是环形队列(ring queue) 多用于2个线程之间传递数据,是标准的先入先出(FIFO)模型。可以用于2个线程中共享数据的同步,而且必须遵循1个线程push in,另一线程pull out的原则。圆形缓冲区适合于事先明确了缓冲区的最大容量的情形。扩展一个圆形缓冲区的容量,需要搬移其中的数据。因此一个缓冲区如果需要经常调整其容量,用链表实现更为合适。
环形队列[Ring Buffer]与线性队列的区别:
圆形缓冲区工作机制:
一般的,圆形缓冲区需要4个指针:
圆形缓冲区的读写指针:
线程 A 媒介 线程 B
data in --> ring buffer/queue --> data out
写指针[写数据] 读指针[读数据]
环形缓冲区(Ring Buffer)初始态
向环形缓冲区(Ring Buffer)中添加一个数据
向环形缓冲区(Ring Buffer)中添加一个数据,并读取一个数据
生产者,消费者与ConsumerBarrier模型:
假设通过生产者已经把数据写入到Ring Buffer了,怎样从Ring Buffer读出这些数据呢?
消费者(Consumer)是一个想从Ring Buffer里读取数据的线程,它可以访问ConsumerBarrier对象——这个对象由RingBuffer创建并且代表消费者与RingBuffer进行交互。就像Ring Buffer显然需要一个序号才能找到下一个可用节点一样,消费者也需要知道它将要处理的序号——每个消费者都需要找到下一个它要访问的序号。在上面的例子中,消费者处理完了Ring Buffer里序号8之前(包括8)的所有数据,那么它期待访问的下一个序号是9。
消费者可以调用ConsumerBarrier对象的waitFor()方法,传递它所需要的下一个序号.
final long availableSeq = consumerBarrier.waitFor(nextSequence);
ConsumerBarrier返回RingBuffer的最大可访问序号——在上面的例子中是12。ConsumerBarrier有一个WaitStrategy方法来决定它如何等待这个序号,我现在不会去描述它的细节,代码的注释里已经概括了每一种WaitStrategy的优点和缺点 。
接下来,消费者会一直原地停留,等待更多数据被写入Ring Buffer。并且,一旦数据写入后消费者会收到通知——节点9,10,11和12 已写入。现在序号12到了,消费者可以让ConsumerBarrier去拿这些序号节点里的数据了。
拿到了数据后,消费者(Consumer)会更新自己的标识(cursor)。
你应该已经感觉得到,这样做是怎样有助于平缓延迟的峰值了——以前需要逐个节点地询问“我可以拿下一个数据吗?现在可以了么?现在呢?”,消费者(Consumer)现在只需要简单的说“当你拿到的数字比我这个要大的时候请告诉我”,函数返回值会告诉它有多少个新的节点可以读取数据了。因为这些新的节点的确已经写入了数据(Ring Buffer本身的序号已经更新),而且消费者对这些节点的唯一操作是读而不是写,因此访问不用加锁。这太好了,不仅代码实现起来可以更加安全和简单,而且不用加锁使得速度更快。
另一个好处是——你可以用多个消费者(Consumer)去读同一个RingBuffer ,不需要加锁,也不需要用另外的队列来协调不同的线程(消费者)。这样你可以在Disruptor的协调下实现真正的并发数据处理
参考:Ring Buffer 有什么特别? - 其他微控制器论坛 - 其他微控制器 - E2E 设计支持 (ti.com)
文章浏览阅读1.4k次。服务器中内存和节点什么意思 内容精选换一换香港节点和大陆节点的区别如下:香港节点购买域名后无需备案,可以直接在后台绑定域名并使用。大陆节点购买域名后需要先完成备案,才可以在后台绑定域名。香港节点支持绑定多个一级或者子域名,大陆节点只能绑定一个一级域名和多个子域名。香港节点不支持对接小程序和公众号。云速建站是自适应建站,不是响应式建站。自适应是根据访问设备不同自动匹配不同的网站,即请检查您的加速域名..._服务器节点是什么意思
文章浏览阅读1.2k次。对于忙碌的职场人士来说,每天都有很多事情要处理。为了不把重要的事情漏掉,需要把待办的事项列下来,做完一个打勾一个,这样一看待办列表,自己做了多少事、还有多少事情没做就可以一目了然。现在有做完一个打一个勾的那种便签,可以帮助用户很好地记录待办事项,这样的便签就是敬业签。一起来看看,敬业签怎么新建待办并打勾完成吧!以手机敬业签为例:1:打开并登录敬业签后,点击底部的“待办”,新增一个待办分类。2:在分类管理页面点右上角+,启动新增待办分类菜单,分类类型选择“待办”,然后填写分类名称并点右下角新增,就可_有没有app 计划多少个 实际完成多少个
文章浏览阅读2.6k次。ONVIF鉴权实现代码生成gSOAP框架代码,这个网上有很多教程,需要加入很多文件,并且需要openssl库。加入需要鉴权的文件和openssl库以后,只需要加每个接口中加入鉴权操作的代码,调用的时候就能实现鉴权。ONVIF的鉴权分两种: HTTP Digest 和 WS-Username Token在ONVIF Device Test Tool上可以对两种鉴权分别进行测试。authenticate.h#ifndef __AUTHENTICATE_H__#define __AUTHENTICAT_digest&ws-username token
文章浏览阅读1.2k次。该篇文章主要来介绍如何减少APK体积,以帮助用户更快地下载App,并加速安装/更新过程。_android apk 大小优化
文章浏览阅读1.3k次。 --/*-----存储过程 分页处理 孙伟 2005-03-28创建 -------*/--/*----- 对数据进行了2分处理使查询前半部分数据与查询后半部分数据性能相同 -------*/--/*-----存储过程 分页处理 孙伟 2005-04-21修改 添加Distinct查询功能-------*/--/*-----存储过程 分页处理 孙伟 2005-05-18修改 多字段排序规则问题-_top 搭配not in 性能
文章浏览阅读1.5w次,点赞3次,收藏10次。VueUse官方链接一、什么是VueUseVueUse不是Vue.use !!!它是一个基于 Composition API 的实用函数集合,下面是具体的一些用法二、如何引入import { 具体方法 } from ‘@vueuse/core’三、下面来看看一些具体的用法1、useMouse:监听当前鼠标坐标的一个方法,他会实时的获取鼠标的当前的位置2、usePreferredDark:判断用户是否喜欢深色的方法,他会实时的判断用户是否喜欢深色的主题3、useLocalStorage:数据_vueuse/core
文章浏览阅读1.8w次,点赞4次,收藏43次。参考连接: link.1、查看树莓派蓝牙开启状态_树莓派连接蓝牙耳机并使用麦克风
文章浏览阅读3.3k次,点赞3次,收藏12次。介绍了输入(input)、输出(print),及字符串格式化(F-string、format与%)方式_%s.%d' %()
文章浏览阅读9.3k次。问题:EL表达式比较字符串或是数字格式的数值是否相等,为true,却不执行为true时的代码。示例:true原因:有可能是test="${ 1 == 1}(这里多个空格)",即大括号与双引号之间多了空格,这个时候,就不会打印true。去掉多余的空格就可以了_el 表达式 判断字符串和数字相等
文章浏览阅读2k次。common_handle_option (continue) 909 case OPT_fcall_used_:910 fix_register (arg, 0, 1);911 break;912 913 case OPT_fcall_saved_:914 fix_register (arg, 0, 0)_-feliminate-unused-debug-types
文章浏览阅读2.7k次。商品参数作者:杨云著出版社:清华大学出版社出版时间:2013-8-1版次:1印次:1印刷时间:2013-8-1页数:434开本:16开装帧:平装ISBN:9787302318286版权提供:清华大学出版社编辑推荐《软件开发训练营·ASP.NET开发一站式学习:难点·案例·练习》特色:1.《软件开发训练营·ASP.NET开发一站式学习:难点·案例·练习》所讲内容既避开艰涩难懂的理论知识,又覆盖了编程..._python语言程序设计实践教程陈东课后习题答案解析
文章浏览阅读2k次。构建:从debug换成release:就可以正常运行了_qt安装后构建可以,运行就一直提示程序异常