无锁队列解决了什么问题?
一、无锁队列解决了什么问题
无锁队列解决了锁引起的问题。mutex是阻塞的,在一个负载较重的应用程序中使用阻塞队列来在线程之间传递消息,会导致频繁的线程切换,大量的时间将被浪费在获取mutex,而不是处理任务上。
这就需要非阻塞来解决问题。任务之间不争抢任何资源,在队列中预定一个位置,然后在这个位置上插入或提取数据。这种机制使用了cas(compare and swap)的操作,它是一个原子操作,需要CPU指令支持。它的思想是先比较,再赋值。具体操作如下:它需要3个操作数,m,A, B,其中m是一个内存地址,将m指向的内存中的数据与A比较,如果相等则将B写入到m指向的内存并返回true,如果不相等则什么也不做返回false。
当一个任务从堆中分配内存时,标准的内存分配机制会阻塞所有与这个任务共享地址空间的其它任务(进程中的所有线程)。malloc本身也是加锁的,保证线程安全。这样也会造成线程之间的竞争。标准队列插入数据的时候,都回导致堆上的动态内存分配,会导致应用程序性能下降。
延伸阅读:
二、无锁队列使用场景
无锁队列适用于队列push、pop非常频繁的场景,效率要比mutex高很多; 比如,股票行情,1秒钟至少几十万数据量。
无锁队列一般也会结合mutex + condition使用,如果数据量很小,比如一秒钟几百个、几千个消息,那就会有很多时间是没有消息需要处理的,消费线程就会休眠,等待唤醒;所以对于消息量很小的情况,无锁队列的吞吐量并不会有很大的提升,没有必要使用无锁队列。
无锁队列的实现,主要分为两类:
链表实现;数组实现。
猜你喜欢LIKE
相关推荐HOT
更多>>
分布式开源物联网MQTT消息服务器EMQ怎么做数据的存储?
一、分布式开源物联网MQTT消息服务器EMQ怎么做数据的存储(1)实现存储的最简单方法是添加一个订阅通配符主题的附加客户端(在MQTT中恰好是#)...详情>>
2023-10-14 22:44:14
数据库种类有哪些?
一、数据库的种类1、关系型数据库(RDBMS)关系型数据库使用表格(二维结构)来组织和存储数据。它们使用结构化查询语言(SQL)进行数据管理和...详情>>
2023-10-14 22:12:41
对数量庞大的照片进行分类管理,较好的方便检索的方法是什么?
一、对数量庞大的照片进行分类管理其实无论任何方法,其实本质都是一样的,就是给照片打上标签,然后按标签分类这些照片(人脸识别也好,地理标...详情>>
2023-10-14 17:18:27
在数据库中,schema、catalog分别指的是什么?
一、在数据库中,schema、catalog分别指的是什么这么说吧,在关系型数据库中,分三级:database.schema.table。即一个数据库下面可以包含多个sc...详情>>
2023-10-14 16:43:29热门推荐
Shell点文件可以为你做点什么?
沸什么是 DMAIC 方法,优点有哪些?
热分布式开源物联网MQTT消息服务器EMQ怎么做数据的存储?
热数据库种类有哪些?
新web前端和UI前端的区别?
Java并发中什么是可见性?
Java中private,默认,protected,public修饰符的区别?
InnoDB的next-key lock为什么是左开右闭的?
Chromium是什么?
为什么分布式数据库这么喜欢用kv store?
web测试流程的重点是什么?
Android开发中为什么很少使用JSON存储数据?
为什么要有U-Boot?
对数量庞大的照片进行分类管理,较好的方便检索的方法是什么?
技术干货






