如何实现ring buffer

如何实现ring buffer,第1张

消息驱动机制是 GUI 系统的基础,消息驱动的底层基础设施之一是消息队列,它是整个 GUI

系统运转中枢,本文介绍了一个基于环形队列的消息队列实现方法,给出了它的数据结构、主要操作流程和核心代码。

环形队列

环行队列是一种首尾相连的队列数据结构,遵循先进先出原则,如下图所示:

ring buffer

示意图

在环形队列中用一组连续地址的存储单元依次存放从队列头到队列尾的元素,通过两个指针

read_pos 和 write_pos 分别指向读取位置和写入位置。

初始化队列时,令 read_pos = write_pos = 0,每当写入一个新元素时,

write_pos 增 1;每当读取一个元素时,read_pos 增 1 。若队列已满,不能往队列写入数据;若队列为空,则不能读取数据。判断对列是否为满的的方法是看 (write_pos + 1)% QUEUE_SIZE == read_pos

是否成立,判断队列是否为空的方法是看 write_pos == read_pos 是否成立。

鉴于多个线程同时访问环形队列,需要考虑线程之间的互斥和同步问题,拟采用锁控制多个线程互斥访问环形队列,使用信号量控制线程之间的同步。

一段时间内只能有一个线程获得锁,当它持有锁时,其它线程要访问环形队列必须等待,直到前者释放锁。由此,锁可以保证多个线程互斥的访问环形队列。

线程从队列对数据前首先判断信号量是否大于 1

,若是,则从队列读数据;否则,进入等待状态,直到信号量大于 1 为止;线程往队列写入一个数据后,会将信号量增 1

,若有线程在等待,则会被唤醒。由此,信号量实现了多线程同步访问环形队列。

流程图

下图是环形缓冲区的初始化、读数据、写数据的主要流程。

ring buffer

流程图

初始化时为环形队列分配内存空间,并完成锁和信号量的初始化;

若往环形队列写数据,首先要获得锁, 若锁已被占用,则进入等待状态,否

则进一步去判断环形队列是否已满。若满了,则释放锁并返回;若队列未满,将 数据写入 write_pos 位置,write_pos 增 1,释放锁并将信号量增

1,表示 已写入一个数据;

若从环形队列读数据,首先判断信号量是否大于 1 ,若不是,则等待,否则

去获取锁,若锁已被占用,则等待,否则从 read_pos 位置读取数据,将 read_pos 增 1 ,释放锁,读取完毕。

数据结构

环形队列的数据结构如下所示:

typedef _MSG {

int message

void* param

} MSG

typedef _MSGQUE {

pthread_mutex_t lock

sem_t wait

MSG* msg

int size

int read_ops

int write_ops

} MSGQUEUE

环形队列包括如下数据:

lock:互斥锁;

wait:信号量

msg:指向数据区的指针;

size:环形队列数据最大个数;

read_ops:读取位置;

write_ops:写入位置。

队列初始化

初始化主要完成三个任务:

为环形队列分配内存;

初始化互斥锁,用 pthread_mutex_init

完成;

初始化信号量,用 sem_init

完成。

/* Create message queue */

_msg_queue = malloc (sizeof (MSGQUEUE))

/* init lock and sem */

pthread_mutex_init (&_msg_queue->lock, NULL)

sem_init (&_msg_queue->wait, 0, 0)

/* allocate message memory */

_msg_queue ->msg = malloc (sizeof(MSG) * nr_msg)

_msg_queue ->size = nr_msg

写操作

如上面的流程图介绍,写操作主要包括如下几步: - 获取锁;

判断队列是否已满;

若没满,将数据写入 write_pos 处,将 write_pos 增 1,并判断

write_pos 是否越界;

释放锁,并将信号量增 1。

/* lock the message queue */

pthread_mutex_lock (_msg_queue->lock)

/* check if the queue is full. */

if ((_msg_queue->write_pos + 1)% _msg_queue->size == _msg_queue->read_pos) {

/* Message queue is full. */

pthread_mutex_unlock (_msg_queue->lock)

return

}

/* write a data to write_pos. */

_msg_queue ->msg [write_pos] = *msg

write_pos ++

/* check if write_pos if overflow. */

if (_msg_queue->write_pos >= _msg_queue->size)

_msg_queue->write_pos = 0

/* release lock */

pthread_mutex_unlock (_msg_queue->lock)

sem_post (_msg_queue->wait)

读操作

同理,读操作分如下几个步骤:

检查信号量;

获取锁;

判断队列是否为空;

若不为空,则读取 read_ops 处的数据,将 read_ops 增 1,并判断

read_pos 是否越界;

并释放锁。

sem_wait (_msg_queue->wait)

/* lock the message queue */

pthread_mutex_lock (_msg_queue->lock)

/* check if queue is empty */

if (_msg_queue->read_pos != _msg_queue->write_pos) {

msg = _msg_queue->msg + _msg_queue->read_pos

/* read a data and check if read_pos is overflow */

_msg_queue->read_pos ++

if (_msg_queue->read_pos >= _msg_queue->size)

_msg_queue->read_pos = 0

return

}

/* release lock*/

pthread_mutex_unlock (_msg_queue->lock)

紧固件专用词中英文对照 螺丝(screw) 英文 英文简写 中文 示意图 头部形状(Head style) Pan Head Pan HD 盘头 Flat Head Flat HD 平头 或 countersunk Head CS HD 沉头 Round Head RD HD 圆头 Oval Head OL HD 半沉头 Pan washer Head Pan wash HD 垫圈盘头 Socket Hd Skt HD 六角圆柱头 Hexagon cap Head Hex Cap HD 外六角头 Square shouder Head SQ SDR HD 方肩头 Cheese Head Ches HD 圆锥头 Wing Head Wing HD 带翼头 穴型状(Driver style) Philips cross recessed Phil 十字 Pozidriv cross recessed Pozi 米字 Torx Torx 内梅花 6-lobular 6-lobu Socket Skt 内六角 Slot Slt 一字槽 表面处理(coating) Znic blue ZB 兰锌 Zinc black ZBK 黑锌 Zinc yellow(Zinc oliver) ZY (ZO) 黄锌 Zinc white ZW 白锌 Silver Plating Sil Plat 镀银 Nickel Plating Nic Plat 镀镍 Dacromet Dacr 达克罗 Heat dip zinc HDZinc 热浸锌 常用英文单词及简写形式 No. 单词 简写 中文 1 screw scr螺丝 2 nut nut螺母 3 washer wash垫圈 4 head hd 头 5 thread thre螺纹 6 coating coat 镀层 7 rivet riv 铆钉 8 standoff stdoff 内外六角钉 9 driver driv 穴 10 hexagon hexa 六角 11 tooth tooth 齿 12 lock lck 锁 13 spring spr 弹簧 14 wave wave 波浪型 15 pitch pitch 牙距 16 partial thread P T 半螺纹 17 PT PT 一种螺纹形式 18 Full Thread FT 全螺纹 19 silver silv 银 20 cone cone 锥形 21 Eco-syn Eco 30度牙的一种螺纹 22 Thread Forming TF 自攻螺纹 23 Self Tapping self tapp 自切屑螺纹 24 pin pin 销 25 shaft Shaf 轴 26 steel St 铁 27 stainless steel SS 不锈钢 28 Brass(Cu) Bras(Cu) 铜 29 Aluminum AL 铝 30 Rubber Rub 橡胶 31 machine screw mech scr 机制螺丝 32 SEM screw SEM Scr 组合螺丝 33 Material material 材料 34 Grade GD 等级 35 Finish Finish 表面处理 36 Point Point 点 37 Clamp Clam 夹子 38 internal Int 内 39 external ext 外 40 thickness / 厚度 41 length / 长度 42 hole / 孔 43 Metric Metcric 公制 44 DIN / 德标 45 ANSI / 美标 46 JIS / 日标 47 ISO / 国际标准 48 NFE / 法标 49 GB / 国家标准 50 Quality / 质量 51 surface hardness 表面硬度 52 product treatment 表面处理 53 plating 电镀 54 heat 热 55 Screws And Shafts For Motorcycle Or Bicycle 机(踏)车用螺丝、轴心 56 Screws And Shafts For Sewing Maching 针车用螺丝、轴心 57 Socket Set Screws 止付螺丝 58 Stainless Steel Coarse Thread Screws 不锈钢宽牙螺丝 59 Stainless Steel High-Low Thread Screws 不锈钢高低牙螺丝 60 Stainless Steel Machine Screws 不锈钢机械螺丝 61 Stainless Steel Self Drilling Screws 不锈钢钻尾螺丝 62 Stainless Steel Self Tapping Screws 不锈钢自攻螺丝 63 Stainless Steel Thread Cutting Screws 不锈钢自削螺丝 64 Stainless Steel Tri-Lobular Thread Screws 不锈钢三角牙螺丝 65 Steel Ceiling Anchors 插片壁虎 66 Drop in Anchors 内迫壁虎 67 Steel Hit Anchors 碳钢锤钉壁虎 68 Steel Hex Coupling Nuts 碳钢六角螺帽 69 Wedge Anchors 强力车修壁虎 70 Cut Anchors 外迫壁虎 71 Chemical Anchors 化学壁虎 72 Heavy Duty Expansion Anchors 不锈钢重载胀栓 73 Tie Wire Anchors 鱼眼壁虎 企眼长螺帽 74 Hammer Drive Anchors 锌合金打入式壁虎 75 Strut Nuts 弹簧螺帽 76 Toggle Bolts (Spring Toggle &Gravity Toggle) 兰花夹系列 77 Nylon Frame Anchors or Metalframe Anchors 门窗、地板专用壁虎 78 Hollow Wall Anchors 石膏板中空壁虎 79 Sleeve Anchors 套管式壁虎 80 Nylon Frame Harmmer Fixing (Nylon Hammer Drive Anchors) 打入式壁虎 鱼形尼龙壁虎 81 Hit Anchors 强力式锤钉壁虎 82 Bolt Anchors 电梯壁虎 83 Heavy duty anchors 重载壁虎 84 Loxin Masonry Anchors 两片夹 85 Set Bolts 定位螺栓 86 Short Strap Anchors 长型兰花夹 87 Drop in Setting Tools 工具棒 88 Elephant foot anchors 象脚壁虎 89 Concrete Insert 水泥预埋件 90 Drop in Anchor with Lip 翻边胀轴 91 Legs Drywall Anchors 冲件 92 Hex Cap Nuts 六角盖头螺帽 93 Hex Serrated Nuts 六角锯齿螺帽 94 Hex Flange Nuts 六角轮缘螺帽 95 Hex Coupling Nuts(High Nuts) 高脚螺帽 96 Round Nuts 圆螺帽 97 Square Nuts 四角螺帽 98 Pipe Nuts 管用螺帽 99 Wheel Nuts 轮壳螺帽 100 Wing Nuts 蝶型螺帽 101 U Nuts U形螺帽 102 T Nuts T形螺帽 103 Eye Nuts 环首螺帽 104 Kep Nuts 齿形螺帽 105 Clinch Nuts 齿花螺帽 106 Corten Steel Heavy Hex Nuts 耐候钢六角重型螺帽 107 Weld Nuts 焊接螺帽 108 Heigh Strength Nuts 高张力螺帽 109 Structural Nuts 建业用螺帽 110 Stainless Steel Nuts 不锈钢螺帽 111 Brass Nuts 铜螺帽 112 Aluminum Nuts 铝螺帽 113 Alloy Steel Nuts 合金钢螺帽 114 Heavy Duty Wheel Hub Nuts 重型车螺帽 115 Acorn Cap Nuts 铁器焊接袋帽 116 All-Metal Prevailing Torque Type Nuts 金属预置扭矩式螺帽 117 Anchor Nuts 壁虎螺帽 118 Big Size Nuts 大尺寸螺帽 119 Closed End Acorn Nuts 铁盖袋帽 120 Conical Washer Nuts 盘形华司螺帽 121 Din 986 Domed Cap Nuts 铁盖+尼龙圈组合盖帽 122 Flange Nylon Insert Lock Nuts 突缘尼龙盖帽 123 Flat Waser Nuts 平面华司螺帽 124 Hex Slotted Nut 六角割沟螺帽 125 Self-Locking Nuts 自锁螺帽 126 Sliding Nuts 制止螺帽 127 Sln Self-Locking Nuts Sln-自动防松螺帽 128 Special Nuts 其它特殊螺帽 129 Spring Nuts 弹簧螺帽 130 Stainless Steel Flange Nuts 不锈钢突缘螺帽 131 Stainless Steel Flange Nylon Insert Lock Nuts 不锈钢六角轮缘尼龙螺帽 132 Stainless Steel Heavy Hex Nuts 不锈钢六角重型螺帽 133 Stainless Steel Hex Nuts 不锈钢六角螺帽 134 Stainless Steel Nylon Insert Lock Nuts 不锈钢尼龙嵌入螺帽 135 Hex Nuts 普通六角螺帽 136 Heavy Hex Nuts 六角重型螺帽 137 Hex Jam Nuts 薄型螺帽 138 Nylon Insert Lock Nuts 尼龙嵌入防松螺帽 139 Hex Machine Screw Nut 机械螺丝用六角螺帽 140 Hex Head Cap Screws(Hex Bolts) 六角螺丝(栓) 141 Hex Head Machine Bolts 六角机械螺丝 142 Hex Lag Bolts 六角木牙螺丝 143 Square Head Bolts 四角螺丝 144 Carriage Bolts 马车螺丝 145 Eye Bolts 环首螺丝 146 Hex Socket Cap Screws 内六角孔螺丝 147 Set Screws 固定螺丝 148 Stud Bolts 螺椿栓 149 Screw Studs 螺旋椿 150 Wheel Bolts 轮壳螺栓 151 Wing Screws 翼形螺丝 152 Self Tapping Screws 自攻螺丝 153 Thread Cutting Screws 自削螺丝 154 Self Drilling Screws 钻尾螺丝 155 Drive Screws 旋入螺丝 156 Machine Screws 机械螺丝 157 Wood Screws 木螺丝 158 Furniture Screws 家具螺丝 159 Chipboard Screws 塑板螺丝 160 Drywall Screws 墙用螺丝 161 Foundation Bolts 基础螺栓 162 U Bolts U型螺栓 163 Hook Bolts 勾头螺栓 164 Toggle Bolts 套挂螺丝 165 Flange Bolts 突缘螺丝 166 Track Bolts 轨道螺栓(鱼尾螺丝) 167 Corten Steel Heavy Hex Bolts 耐候钢螺丝 168 T.C.Bolts 扭矩控制螺栓 169 High Strength Bolts 高张力螺栓 170 Welding Studs 剪力钉(焊接螺丝) 171 Screws And Washers Assembled(Sems) 螺丝附华司组合 172 Big Size Bolts 大尺寸螺栓 173 Stainless Steel Sheet Metal Screws 不锈钢小螺丝 174 Stainless Steel Bolts 不锈钢大螺丝 175 Brass Screws 铜螺丝 176 Aluminum Screws 铝螺丝 177 Alloy Steel Screws 合金钢螺丝 178 Electronic Screws 电子螺丝 179 Micro Screws 微小精密螺丝 180 Plastic Screws 塑料螺丝 181 Particle Board Screws 复合材料用螺丝 182 Titanium Alloy Bolts 钛合金螺丝 183 Ti,Zr,Mo,Nb Pare Metal Bolts Parts 钛、锆、钼、铌等螺丝、零件、材料 184 Thumb Screws 拇指螺丝 185 Double End Screws Hanger Bolt 双头牙螺丝 186 Automotive Fasteners 车辆(汽车)螺丝、螺帽 187 Aerospace Fasteners 航天用螺丝 188 Source Control Bolts 飞机特殊扣件 189 Blind Bolts 拉栓 190 Panel Fasteners 面板螺丝 191 Elevator Bolts 电梯螺丝 192 Square Set Screws 四角头固定螺丝 193 T Head Bolts T头螺丝 194 Step Bolts 大头马车螺丝 195 One Way Lag Screws 单向螺丝 196 Hose Clamp Screws 管夹螺丝 197 Stainless Steel Hex Socket Cap Screws 不锈钢固定螺丝 198 Stainless Steel Hex Socket Cap Screws 不锈钢内六角螺丝 199 Hinge Screws 铰链螺丝 200 Container Screws 货柜螺丝 201 Bi-Metal Self Drilling Screws 复合材料钻尾螺丝 202 Trilobular Thread Screws 三角牙螺丝 203 High Low Screws 高低牙螺丝 204 Particle Board Screws 夹板用螺丝 205 Toilet Closet Bolts 马桶螺丝 206 Special Longer Screws 特长螺丝 207 Building Fasteners 建业螺丝 208 Stainless Steel Hex Socket Cap Screws 不锈钢六角螺丝 209 Special Screws Or Bolts 其它特殊螺丝 210 Special Stainless Steel Screws 不锈钢特殊螺丝 211 Collated Screws 链带螺丝 212 Coarse Thread Screws 宽牙螺丝(粗牙螺丝) 213 Concrete Screws 水泥螺丝 214 Construction Bolts 板模螺丝 215 Die Cast Wing ScrewsZinc Alloy 锌蝶螺丝 216 Heavy Duty Wheel Hub Bolts 重型车螺丝 217 Hex Socket Set Screws 内六角固定螺丝 218 Particle Board Screws 复合材料用螺丝(夹板用) 219 Plow Bolts 犁壁螺丝 220 Stainless Steel Wood Screws 不锈钢木螺丝 221 Toggle Bolts 套挂螺栓及螺丝 222 Titanium Alloy Expansion Bolts 钛合金膨胀螺丝 223 Hex Cap Nuts 六角盖头螺帽 224 Hex Serrated Nuts 六角锯齿螺帽 225 Hex Flange Nuts 六角轮缘螺帽 226 Hex Coupling Nuts(High Nuts) 高脚螺帽 227 Round Nuts 圆螺帽 228 Square Nuts 四角螺帽 229 Pipe Nuts 管用螺帽 230 Wheel Nuts 轮壳螺帽 231 Wing Nuts 蝶型螺帽 232 U Nuts U形螺帽 233 T Nuts T形螺帽 234 Eye Nuts 环首螺帽 235 Kep Nuts 齿形螺帽 236 Clinch Nuts 齿花螺帽 237 Corten Steel Heavy Hex Nuts 耐候钢六角重型螺帽 238 Weld Nuts 焊接螺帽 239 Heigh Strength Nuts 高张力螺帽 240 Structural Nuts 建业用螺帽 241 Stainless Steel Nuts 不锈钢螺帽 242 Brass Nuts 铜螺帽 243 Aluminum Nuts 铝螺帽 244 Alloy Steel Nuts 合金钢螺帽 245 Heavy Duty Wheel Hub Nuts 重型车螺帽 246 Acorn Cap Nuts 铁器焊接袋帽 247 All-Metal Prevailing Torque Type Nuts 金属预置扭矩式螺帽 248 Anchor Nuts 壁虎螺帽 249 Big Size Nuts 大尺寸螺帽 250 Closed End Acorn Nuts 铁盖袋帽 251 Conical Washer Nuts 盘形华司螺帽 252 Din 986 Domed Cap Nuts 铁盖+尼龙圈组合盖帽 253 Flange Nylon Insert Lock Nuts 突缘尼龙盖帽 254 Flat Waser Nuts 平面华司螺帽 255 Hex Slotted Nut 六角割沟螺帽 256 Self-Locking Nuts 自锁螺帽 257 Sliding Nuts 制止螺帽 258 Sln Self-Locking Nuts Sln-自动防松螺帽 259 Special Nuts 其它特殊螺帽 260 Spring Nuts 弹簧螺帽 261 Stainless Steel Flange Nuts 不锈钢突缘螺帽 262 Stainless Steel Flange Nylon Insert Lock Nuts 不锈钢六角轮缘尼龙螺帽 263 Stainless Steel Heavy Hex Nuts 不锈钢六角重型螺帽 264 Stainless Steel Hex Nuts 不锈钢六角螺帽 265 Stainless Steel Nylon Insert Lock Nuts 不锈钢尼龙嵌入螺帽 266 Zinc Die Casting Nuts 锌压属螺帽 267 Hex Nuts 普通六角螺帽 268 Heavy Hex Nuts 六角重型螺帽 269 Nylon Insert Lock Nuts 尼龙嵌入防松螺帽 270 Hex Jam Nuts 薄型螺帽 271 Hex Machine Screw Nut 机械螺丝用六角螺帽 272 Alloy Steel Wire Rod 合金钢线材盘元 273 Annealing Wire And Rod 球状化线材 274 Black Wire 黑铁丝 275 Brass Wire And Rod 黄铜棒线 276 Bright Steel Bar(Hex/Round/Square) 磨光棒钢 277 Copper Alloy Wire 铜合金线 278 E.D.M Cutting Wire 线切割线 279 Free Cutting Steel Wire Rod 快削钢线材盘元 280 Iron Or Steel Wire 线材 281 Iron Or Steel Wire Rod 线材盘元 282 Nickel Silver Wire 洋白铜线 283 Phosphate Bronze Wire 磷青铜线 284 Stainless Steel Bar(Round/Hex/Square) 不锈钢条棒 285 Stainless Steel Cold Heading Wire 不锈钢冷锻线材 286 Stainless Steel Draw Wire 不锈钢线(抽线后) 287 Stainless Steel Wire 不锈钢线材 288 Stainless Steel Wire And Rod 不锈钢线材及盘元 289 Steel Bar(Hex/Round/Square) 棒钢 290 evolving Wire Twisting Machine 转回90度碾线头机 90讧 291 Air Riveter 气动拉钉机


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/177404.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-03-27
下一篇2023-03-27

发表评论

登录后才能评论

评论列表(0条)

    保存