ypipe, zmq的核心部件,无锁读写的管道。
必须指出,无锁读写只限于单个读跟单个写之间,读与读,还有写与写之间必须确保同步。所以ypipe不必读写锁rwlock或者读写之间的锁,但需要读锁跟写锁两个锁,在读端之间或在写端之间仍然是临界资源。本质上,ypipe是一种双队列缓冲策略的优化实现。
ypipe使用_r(ead), _w(rite), _f(lush), _c(as, which means CompareAndSwap : https://en.m.wikipedia.org/wiki/Compare-and-swap)四个装置来控制读跟写对FIFO queue的访问,从而实现两者无锁并行访问。
_r, _w, _f三个游标指针,_c是一个lock-free指针,写只控制_w, _f, _q.back并负责更新_c,读则取_c更新_r。_c是写跟读之间的一个安全装置,写不能直接从_w更新到_r,必须中间通过一个_c。
地址关系如下
NULL < _q.front <=_r <=_c <= _w <= _f <= _q.back.
读会pop _q,使_q.front向前步进,可以安心读到_r,然后必须从_c得到更新_r,才能够继续读。
写会push _q,使_q.back向前步进。_f是写提交,写可以撤回_f到_q.back之间的内容,_w是读提交,并更新到_c,目的是更新到_r。
problem is
1. nobody update cas, reader can read ahead.
2. batch wrtie, should write(incomplete=false) before flush, otherwise flush do nothing.
advantage:
1. reader not block writer, writer not block reader
2. transaction batch write into queue.
最后,从libzmq抽离ypipe代码,并用LF线程池作了benchmark比较。
benchmark放在我的github上。https://github.com/bbqz007/zhelper/tree/master/threading/benchmark/lf
ypipe, zmq的核心部件,无锁读写的管道。的更多相关文章
- 【实战Java高并发程序设计6】挑战无锁算法:无锁的Vector实现
[实战Java高并发程序设计 1]Java中的指针:Unsafe类 [实战Java高并发程序设计 2]无锁的对象引用:AtomicReference [实战Java高并发程序设计 3]带有时间戳的对象 ...
- [转]透过 Linux 内核看无锁编程
非阻塞型同步 (Non-blocking Synchronization) 简介 如何正确有效的保护共享数据是编写并行程序必须面临的一个难题,通常的手段就是同步.同步可分为阻塞型同步(Blocking ...
- zeromq源码分析笔记之无锁队列ypipe_t(3)
在上一篇中说到了mailbox_t的底层实际上使用了管道ypipe_t来存储命令.而ypipe_t实质上是一个无锁队列,其底层使用了yqueue_t队列,ypipe_t是对yueue_t的再包装,所以 ...
- 无锁同步-JAVA之Volatile、Atomic和CAS
1.概要 本文是无锁同步系列文章的第二篇,主要探讨JAVA中的原子操作,以及如何进行无锁同步. 关于JAVA中的原子操作,我们很容易想到的是Volatile变量.java.util.concurren ...
- 使用CAS实现无锁的SkipList
无锁 并发环境下最常用的同步手段是互斥锁和读写锁,例如pthread_mutex和pthread_readwrite_lock,常用的范式为: void ConcurrencyOperation() ...
- java多线程无锁和工具类
1 无锁 (1) cas (compare and swap) 设置值的时候,会比较当前值和当时拿到的值是否相同,如果相同则设值,不同则拿新值重复过程:注意,在设置值的时候,取值+比较+设值 是一条c ...
- C++性能榨汁机之无锁编程
C++性能榨汁机之无锁编程 来源 http://irootlee.com/juicer_lock_free/ 前言 私以为个人的技术水平应该是一个螺旋式上升的过程:先从书本去了解一个大概,然后在实践中 ...
- 【漫画】CAS原理分析!无锁原子类也能解决并发问题!
本文来源于微信公众号[胖滚猪学编程].转载请注明出处 在漫画并发编程系统博文中,我们讲了N篇关于锁的知识,确实,锁是解决并发问题的万能钥匙,可是并发问题只有锁能解决吗?今天要出场一个大BOSS:CAS ...
- 无锁机制----比较交换CAS Compare And Swap
一.锁与共享变量 加锁是一种悲观的策略,它总是认为每次访问共享资源的时候,总会发生冲突,所以宁愿牺牲性能(时间)来保证数据安全. 无锁是一种乐观的策略,它假设线程访问共享资源不会发生冲突,所以不需要加 ...
- MySQL 8.0:无锁可扩展的 WAL 设计
这篇文章整理自MySQL官方文档,介绍了8.0在预写式日志上实现上的修改,观点总结如下: 在8.0以前,为了保证flush list的顺序,redo log buffer写入过程需要加锁,无法实现并行 ...
随机推荐
- 【Docker内容大集合】Docker从认识到实践再到底层原理大汇总
前言 那么这里博主先安利一些干货满满的专栏了! 首先是博主的高质量博客的汇总,这个专栏里面的博客,都是博主最最用心写的一部分,干货满满,希望对大家有帮助. 高质量博客汇总https://blog.cs ...
- ABC306 A - F
ABC306 A - F 代码不提供 A 题意:吧字符串的每个字符连续输出两遍,记得不要快读,不要忘记输入 $ n $ 纪念 Qinzh A 题 WA 掉 B 题意:给定长度为 $ 64 $ 的数组 ...
- Oracle 11g ADG 部署(duplicate)快速参考
本文旨在指导客户完成Oracle 11g的ADG部署工作,主库环境已具备,备库环境已安装完成数据库软件. 环境:RHEL 6.8 + Oracle 11.2.0.4 1.确认主库运行在归档模式 2.确 ...
- MySQL中 int(11)和int(10)有没有区别!!
结论:int(11) int(3) int(20) 若不勾选填充0,那么效果统统一样,若勾选了填充0:查询出来的效果 会是这样: int(11) 00000000123 int(3) 123 ...
- HBase Shell将命令执行结果导出到文件
1.将Hbase shell执行结果输出到文件 echo "scan 'test'" | hbase shell>my.txt 2.查看表的region数 list_regi ...
- SATA学习笔记——名词解释
SATASATA(Serial Advanced Technology Attachment,串行高级技术附件)是一种基于行业标准的串行硬件驱动器接口,是由Intel.IBM.Dell.APT.Max ...
- 2024 SICTF Round#3出题 crypto misc osint
有幸参与了本次比赛crypto misc OSINT出题,难易程度循序渐进,下面记录一下本人题目题解(( 比赛网址:https://yuanshen.life/ CRYPTO SuperbRSA(85 ...
- Linux yum 介绍
本文介绍:什么是Yum及其常用的20个命令.以下内容来源: ---------------------------------------------------------------------- ...
- Docker实践之10-图形化管理
lazydocker https://github.com/jesseduffield/lazydocker 一个基于命令行终端的,支持Docker和Docker Compose的图形化界面,支持鼠标 ...
- Docker实践之07-数据管理
目录 一.数据卷概述 二.创建数据卷 三.查看数据卷 四.挂载数据卷 五.删除数据卷 六.挂载主机目录或文件 七.挂载数据卷与主机目录/文件的比较 一.数据卷概述 数据卷是一个可供一个或多个容器使用的 ...