博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
并发无锁队列学习(单生产者单消费者模型)
阅读量:6755 次
发布时间:2019-06-26

本文共 1025 字,大约阅读时间需要 3 分钟。

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、单生产者单消费者变长队列

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

  具体见我博客关于边长数组介绍

 

typedef struct{    uint32_t r_index; /*读指针*/    uint32_t w_index; /*写指针*/    uint32_t e_index; /*队列结束指针*/    uint32_t size;    /*缓冲区大小*/    char *buff[0];    /*缓冲区起始地址*/}ring_buff_st;
你可能感兴趣的文章
跟我学交换机配置(七)
查看>>
makefile 中 $@ $^ % 2015-04-11 18:02:36
查看>>
C#强化系列文章三:实验分析C#中三种计时器使用异同点
查看>>
Linux 进程间通信(一)
查看>>
通用对象池ObjectPool的一种简易设计和实现方案
查看>>
HTTP压缩仍让加密连接处于风险之中
查看>>
乐视阿里达成百亿元销售框架
查看>>
戴尔通过提升大数据分析能力巩固“全数据”战略 帮助企业在现代数据经济中蓬勃发展...
查看>>
⑤Windows Server 8 RemoteFX体验
查看>>
《企业云桌面实施》-小技巧-03-vSAN6.5中SAS和SSD的使用建议
查看>>
cocos2d-x学习笔记番外篇02:获取系统毫秒时间
查看>>
perl学习笔记(1)
查看>>
连接第三方 腾讯QQ家校.师生群向智慧教学一路狂奔
查看>>
简单三步,搞定“量产”Windows 2008
查看>>
excel查找替换转义问号
查看>>
初始化游戏状态数据
查看>>
delphi 显示窗体系统目录 源码
查看>>
PowerDesigner 业务处理模型( BPM ) 说明
查看>>
Redis内存存储结构分析
查看>>
OCP终于考完了
查看>>