并发无锁队列学习(单生产者单消费者模型)

1、引言
本文介绍单生产者单消费者模型的队列。依据写入队列的内容是定长还是变长,分为单生产者单消费者定长队列和单生产者单消费者变长队列两种。

单生产者单消费者模型的队列操作过程是不须要进行加锁的。生产者通过写索引控制入队操作,消费者通过读索引控制出队列操作。二者相互之间对索引是独享,不存在竞争关系。

例如以下图所看到的:
这里写图片描写叙述
2、单生产者单消费者定长队列

  这样的队列要求每次入队和出队的内容是定长的。即生产者写入队列和消费者读取队列的内容大小事同样的。

linux内核中的kfifo就是这样的队列,提供了读和写两个索引。单生产者单消费者队列数据结构定义例如以下所看到的:
  

typedef struct
{uint32_t r_index; /*读指针*/uint32_t w_index; /*写指针*/uint32_t size;    /*缓冲区大小*/char *buff[0];    /*缓冲区起始地址*/
}ring_buff_st;

为了方便计算位置。设置队列的大小为2的次幂。这样可以将之前的取余操作转换为位操作。即r_index = r_index % size 与 r_index = r_index & (size -1)等价。位操作很快,充分利用了二进制的特征。
(1)队列初始状态,读写索引相等,此时队列为空。
这里写图片描写叙述
(2)写入队列

写操作即进行入队操作。入队有三种场景,

2.1 写索引大于等于读索引
这里写图片描写叙述
这里写图片描写叙述
2.2写索引小于读索引
这里写图片描写叙述
2.3.写索引后不够写入一个
这里写图片描写叙述
(3)读取队列

读队列分为三种场景

3.1写索引大于等于读索引
这里写图片描写叙述
3.2写索引小于读索引
这里写图片描写叙述
3.3.读索引后面不够一个
这里写图片描写叙述
3、单生产者单消费者变长队列

  有些时候生产者每次写入的数据长度是不确定的,导致写入队列的数据时变长的。这样为了充分利用队列。须要添加一个结束索引,保证队列末尾至少可以写入一个数据。变长队列数据结构定义例如以下:
  具体见我博客关于边长数组介绍

http://blog.csdn.net/xy010902100449/article/details/46522533
 

typedef struct
{uint32_t r_index; /*读指针*/uint32_t w_index; /*写指针*/uint32_t e_index; /*队列结束指针*/uint32_t size;    /*缓冲区大小*/char *buff[0];    /*缓冲区起始地址*/
}ring_buff_st;

转载于:https://www.cnblogs.com/yutingliuyl/p/7353062.html

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

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

相关文章

ecshop 收货人信息电话必填改为手机必填

首先通过在flow.dwt中,查找flow.php?stepconsignee中的关键字 consignee(结算中心)查找所在模板/Library/consignee.lbi 大概57行 把必填去掉,其次 在js/shopping_flow.js里边注释掉 if (Utils.isEmpty(frm.elements[‘tel’].v…

流媒体传输协议

1.流媒体( Streaming Media) 1.1流媒体概念 流媒体技术是网络技术和多媒体技术发展到一定阶段的产物。术语流媒体既可以指在网上传输连续时基媒体的流式技术,也可以指使用流式技术的连续时基媒体本身。在网上传输音频、视频等多媒体信息目前主要有两种方式:下载和流…

关闭浏览器网页触发事件_浅析浏览器渲染和 script 加载

前言前端代码离不开浏览器环境,理解 js、css 代码如何在浏览器中工作是非常重要的。如何优化渲染过程中的回流,重绘?script 脚本在页面中是怎么个加载顺序?了解这些对前端性能优化起着非常大的作用。借着这篇文章,让自…

Open vSwitch实验常用命令

1. 基本架构 ovs-vsctl: 管理ovsdb-server的配置,提供OVSDB的配置方法,包括创建和删除网桥、端口等; ovs-ofctl: 提供ovs-vswitchd的流表配置方法; ovs-dpctl: 配置OVS内核模块,提供缓存流表的操作方法&#xff1b…

记IOS8中碰到的一个JS bug

IOS8的JS版本过低导致 var id "123"; var temp1 {id, "left": "200"}; // error in IOS8 var temp2 {"id":id, "left": "200"};平时还是多写ES5的代码,es6的语法总能碰到兼容的坑。 改了好几天。…

Emmet的html语法

Emmet的html语法 所有操作按下“tab”键即可瞬间完成 元素 1.在编辑器中输入元素名称,即可自动补全生成 HTML 标签,即使不是标准的 HTML 标签。 2.输入:! 或者 html:5 或者 html:4s 或者 html:4t 将自动补全html基本结构 嵌套操作 1.使用…

RTP Payload Format for H.264 Video

H.264 RTP协议的封装格式rfc3984 英文原版:http://tools.ietf.org/html/rfc3984 部分中文翻译: H.264 视频 RTP 负载格式 1. 网络抽象层单元类型 (NALU) NAL单元1字节包头负载 NALU 头由一个字节组成, 它的语法如下: —————|0|1|2|3|4|5|6|7|------…

js字符串、数组和数字常用方法总结

https://github.com/AnHyun/blog/issues/3 一、string 常用方法: 1.substring(start开始位置的索引,end结束位置索引) 截取的位置不包含结束位置的字符,只写一个参数表示从开始位置截取到最后,输入负值时将负值变为0,哪个较小作为开始位置 va…

Oracle 存储过程错误之PLS-00201: 必须声明标识符

转自:http://blog.csdn.net/u010678947/article/details/20702149 错误: ORA-06550: 第 1 行, 第 7 列: PLS-00201: 必须声明标识符ZUO.PROCE_TESTORA-06550: 第 1 行, 第 7 列: PL/SQL: Statement ignored 解决方法: (1&#x…

mysql中如何把两个查询结果列数不同并成一张表_MySQL

引言本文整理了MySQL相关的知识,方便以后查阅。 基础架构下图是 MySQL 的一个简要架构图,从下图你可以很清晰的看到用户的 SQL 语句在 MySQL 内部是如何执行的。 先简单介绍一下下图涉及的一些组件的基本作用帮助大家理解这幅图。 - 连接器: …

JavaWeb笔记01-XML

今日内容 XML 概念语法解析 XML: 概念: Extensible Markup Language 可扩展标记语言 可扩展:标签都是自定义的.<user><student> 功能 存储数据 配置文件在网络中传输 一个故事 由于浏览器之间的竞争,导致HTML发展的十分不顺利 用户:唉,这怎么报错了呢?…

centos下如何使用sendmail发送邮件

最近在实施服务端日志监控脚本&#xff0c;需要对异常情况发送邮件通知相关责任人&#xff0c;记录下centos通过sendmail发送邮件的配置过程。一. 安装sendmail和mailx1、安装sendmail&#xff1a;1): centos下可以安装命令:yum install -y sendmail service sendmail start yu…

H.263 H.263+ Payload Type

h263 rtp协议封装协议英文版&#xff1a;rfc4629:http://tools.ietf.org/html/rfc4629 以下文章是部分参考翻译&#xff1a; 文章出处&#xff1a; http://blog.csdn.net/zblue78/archive/2009/04/09/4059414.aspxGeneral H.263 Payload Header The H.263 payload header is s…

OC 中 load 方法和 initialize 方法的异同

(void)load; 当类对象被引入项目时, runtime 会向每一个类对象发送 load 消息load 方法会在每一个类甚至分类被引入时仅调用一次,调用的顺序:父类优先于子类, 子类优先于分类load 方法不会被类自动继承 (void)initialize; 也是在第一次使用这个类的时候会调用这个方法 转载于:h…

scrapy框架_Python学习之Scrapy框架

爬虫界江湖地位No.1说起Python&#xff0c;不得不说到它的爬虫应用&#xff0c;由于Python的短小精悍&#xff0c;用它来开发爬虫应用是最合适不过了&#xff0c;基于Python抓取网页的库有很多&#xff0c;例如requests,beatifulsoup等等&#xff0c;但是要说到有哪一个框架&am…

JavaWeb笔记03-Servlet

今日内容 ServletHTTP协议Request Servlet 概念 步骤 执行原理 生命周期 Servlet3.0注解配置 Servlet的体系结构 Servlet – 接口 GenericServlet – 抽象类:将Servlet接口中其他方法做了默认空实现,只将service()方法作为抽象 将来定义Servlet类时候,可以继承Generic…

Android开发中无处不在的设计模式——动态代理模式

继续更新设计模式系列。写这个模式的主要原因是近期看到了动态代理的代码。 先来回想一下前5个模式&#xff1a; - Android开发中无处不在的设计模式——单例模式 - Android开发中无处不在的设计模式——Builder模式 - Android开发中无处不在的设计模式——观察者模式 - A…

用于MPEG-4视听流的RTP负载格式

MPEG-4的rtp协议封装英文原版 RFC 3016&#xff1a;http://www.rfc-editor.org/rfc/rfc3016.txt中文翻译&#xff1a;组织&#xff1a;中国互动出版网&#xff08;http://www.china-pub.com/&#xff09;RFC文档中文翻译计划&#xff08;http://www.china-pub.com/compters/emo…

pycharm python 模板配置_windows下pycharm安装、创建文件、配置默认模板

本文为大家分享了windows下pycharm安装、创建文件、配置默认模板的具体步骤&#xff0c;供大家参考&#xff0c;具体内容如下步骤&#xff1a;下包 —->安装——>创建文件—->定制模板一、下包官方地址这里有企业版和社区版&#xff0c;老司机都知道社区版是免费的&am…

JavaWeb笔记02-Tomcat

今日内容 web相关概念回顾web服务器软件:TomcatServlet入门学习 web相关概念回顾 软件架构 C/S: 客户端/服务器端B/S: 浏览器/服务器端 资源分类 静态资源: 所有用户访问后,得到的结果都是一样的,成为静态资源,静态资源可以直接被浏览器解析 如:html, css ,JavaScript 动态资…