1. 背景 go代码中要实现异步很简单,go funcName()。 但是进程需要控制协程数量在合理范围内,对应大批量任务可以使用“协程池 + 无锁队列”实现。 2. golang无锁队列实现思路 Channel是Go中的一个核心类型,你可以把它看成一个管道,通过它并发核心单元就可以发送或者接收数据 ...
分类:
编程语言 时间:
2018-12-31 12:19:27
阅读次数:
383
无锁队列 介绍 在工程上,为了解决两个处理器交互速度不一致的问题,我们使用队列作为缓存,生产者将数据放入队列,消费者从队列中取出数据。这个时候就会出现四种情况,单生产者单消费者,多生产者单消费者,单生成者多消费者,多生产者多消费者。我们知道,多线程往往会带来数据不一致的情况,一般需要靠加锁解决问题。 ...
分类:
其他好文 时间:
2018-12-23 17:53:55
阅读次数:
224
基于无锁队列和c++11的高性能线程池线程使用c++11库和线程池之间的消息通讯使用一个简单的无锁消息队列适用于linux平台,gcc 4.6以上 标签: <无> 基于无锁队列和c++11的高性能线程池线程使用c++11库和线程池之间的消息通讯使用一个简单的无锁消息队列适用于linux平台,gcc ...
分类:
编程语言 时间:
2018-10-10 17:17:37
阅读次数:
293
环形缓冲区是生产者和消费者模型中常用的数据结构。生产者将数据放入数组的尾端,而消费者从数组的另一端移走数据,当达到数组的尾部时,生产者绕回到数组的头部。如果只有一个生产者和一个消费者,那么就可以做到免锁访问环形缓冲区(Ring Buffer)。写入索引只允许生产者访问并修改,只要写入者在更新索引之前 ...
分类:
其他好文 时间:
2018-07-05 21:23:28
阅读次数:
188
folly无锁队列是facebook开源的一个无所队列,使用的是单向链表,通过compare_exchange语句实现的多生产多消费的队列,我曾经花了比较多的时间学习memory_order的说明,对release-acquire语义,自认为还是比较了解。如果一个atomic对象使用std::mem ...
分类:
其他好文 时间:
2018-05-07 00:00:06
阅读次数:
407
1 伪命题 这本身是个伪命题。 多线程之间使用队列是一定需要做到同步的。也就是说一定是需要同步手段的,一定要在一个线程读写的时候,阻塞另一个线程。既然不然用锁,那就是用原子变量吧。 2 CAS 3 实现 队列,这里使用链表来实现 然后,考虑push,在push的时候,要在push_start的nex ...
分类:
其他好文 时间:
2018-03-18 01:23:43
阅读次数:
195
并发无锁队列学习之一【开篇】 1、前言 队列在计算机中非常重要的一种数据结构,尤其在操作系统中。队列典型的特征是先进先出(FIFO),符合流水线业务流程。在进程间通信、网络通信之间经常采用队列做缓存,缓解数据处理压力。结合自己在工作中遇到的队列问题,总结一下对不同场景下的队列实现。根据操作队列的场景 ...
分类:
其他好文 时间:
2018-02-25 14:41:03
阅读次数:
388
关于无锁队列的概念与实现,可以参考博文《无锁队列的实现》,主要涉及到的知识点包括CAS原子操作、无锁队列的链表实现、无锁队列的数组实现以及ABA问题。 下面借鉴了《多线程的那点儿事(之无锁队列)》的代码,说明两个线程(一个添加一个读取数据)之间的无锁队列,可以不借助线程互斥方法就能够达到并行效果。代 ...
分类:
编程语言 时间:
2017-12-08 21:03:28
阅读次数:
227
性能非常强大,达到1400w/s。对比其他Disruptor实现,这个实现太简洁了。 作者是https://www.zhihu.com/people/gowkh。 代码在https://github.com/yireyun/go-queue/blob/master/esQueue.go ...
分类:
其他好文 时间:
2017-10-12 13:10:52
阅读次数:
134
1、引言 本文介绍单生产者单消费者模型的队列。依据写入队列的内容是定长还是变长,分为单生产者单消费者定长队列和单生产者单消费者变长队列两种。单生产者单消费者模型的队列操作过程是不须要进行加锁的。生产者通过写索引控制入队操作,消费者通过读索引控制出队列操作。二者相互之间对索引是独享,不存在竞争关系。例 ...
分类:
其他好文 时间:
2017-08-13 13:23:39
阅读次数:
235