无锁队列
第一篇文章末尾我们提到的《无锁队列的实现》(陈皓(hào)),该文末尾提到的“用数组实现无锁队列”,即用 RingBuffer 实现的无锁队列。
分类:
其他好文 时间:
2015-01-05 10:44:19
阅读次数:
305
在之前的一篇博客中,写了一个在特殊情况下,也就是只有一个读线程和一个写线程的情况下,的无锁队列的实现。其中甚至都没有利用特殊的原子加减操作,只是普通的运算。这样做的原因是,即使是特殊的原子加减操作,也比普通的加减运算复杂度高很多。因此文中的实现方法可以达到很高的运行效率。但是,有的情况下并不是只有一...
分类:
编程语言 时间:
2014-12-09 00:15:40
阅读次数:
300
再来看看一个包走共享内存的流程先来看看net进程这块如何处理的{//用shareData这种类型封装刚才从无锁队列中取到的包 shareData sd; sd.channel_id = pkt.channel_id; sd.data = pkt.data...
分类:
Web程序 时间:
2014-11-09 00:49:11
阅读次数:
272
关于无锁队列的概念与实现,可以参考博文《无锁队列的实现》,主要涉及到的知识点包括CAS原子操作、无锁队列的链表实现、无锁队列的数组实现以及ABA问题。 下面借鉴了《多线程的那点儿事(之无锁队列)》的代码,说明两个线程(一个添加一个读取数据)之间的无锁队列,可以不借助线程互斥方法就能够达到并行效...
分类:
编程语言 时间:
2014-11-04 10:36:38
阅读次数:
226
环形缓冲区是生产者和消费者模型中常用的数据结构。生产者将数据放入数组的尾端,而消费者从数组的另一端移走数据,当达到数组的尾部时,生产者绕回到数组的头部。如果只有一个生产者和一个消费者,那么就可以做到免锁访问环形缓冲区(Ring Buffer)。写入索引只允许生产者访问并修改,只要写入者在更新索引之前...
分类:
其他好文 时间:
2014-10-24 18:43:40
阅读次数:
295
本文讲的缓冲队列为链接方式, 链接方式一般通过预分配一个结点作为接力点来实现无锁队列, 优点是实现简单, 缺点是浪费一个结点的内存, 当结点内存块尺寸较大时浪费就大了。如何不浪费一个结点内存的链接方式无锁队列? 当队列中只有一个结点时, 本缓冲队列中使用了原子锁进行操作, 这是一种平衡策略, 若读者有更好方法不妨告之一下!...
分类:
编程语言 时间:
2014-10-22 12:57:41
阅读次数:
240
前面在《眉目传情之匠心独运的kfifo》一文中详细解析了 linux 内核并发无锁环形队列kfifo的原理和实现,kfifo鬼斧神工,博大精深,让人叹为观止,但遗憾的是kfifo为内核提供服务,并未开放出来。剑不试则利钝暗,弓不试则劲挠诬,鹰不试则巧拙惑,马不试则良驽疑,光说不练是不能学到精髓的,下面就动手实现自己的并发无锁队列UnlockQueue(单生产者单消费者)。...
分类:
其他好文 时间:
2014-10-11 19:11:36
阅读次数:
336
昨天完成了无锁队列的实现,然后思考了一下锁的原理,锁的核心无非是保证有一个变量需要被原子性地更新,比如,我们用一个bool x,表示锁,当我们获取锁的时候,我们需要保证的是锁能够只在同一时间被多个线程中的一个线程去读取和更新,在逻辑上有如下的代码:
bool GetLock(bool& x){
if(x){
x= false;
...
分类:
其他好文 时间:
2014-10-10 20:34:04
阅读次数:
198
在并发处理应用中,一般使用锁的方式来解决竞争问题,但锁的效率比较低,因此,在高并发处理中,无锁队列成为应用的需要。CAS无锁算法主要依赖于处理器的支持,绝大多数处理器都支持:
X86平台:CMPXCHG 汇编指令。
在一个指令周期内执行完成,因此是原子性的。
这一原理性操作过程如果采用C描述如下:
intcompare_and_swap (int* reg, int old...
分类:
其他好文 时间:
2014-08-21 19:32:34
阅读次数:
207
1.数据的来源NetProcSvr::init()->libevent::conn_readcb(读事件)->Channel::read_datastream(读到数据流)->TCPServer::on_receive_data读包->from_net_push_pkt(放到无锁队列中去即m_all...
分类:
其他好文 时间:
2014-07-26 09:52:07
阅读次数:
248