必须指出,无锁读写只限于单个读跟单个写之间,读与读,还有写与写之间必须确保同步。所以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的核心部件,无锁读写的管道。的更多相关文章

  1. 【实战Java高并发程序设计6】挑战无锁算法:无锁的Vector实现

    [实战Java高并发程序设计 1]Java中的指针:Unsafe类 [实战Java高并发程序设计 2]无锁的对象引用:AtomicReference [实战Java高并发程序设计 3]带有时间戳的对象 ...

  2. [转]透过 Linux 内核看无锁编程

    非阻塞型同步 (Non-blocking Synchronization) 简介 如何正确有效的保护共享数据是编写并行程序必须面临的一个难题,通常的手段就是同步.同步可分为阻塞型同步(Blocking ...

  3. zeromq源码分析笔记之无锁队列ypipe_t(3)

    在上一篇中说到了mailbox_t的底层实际上使用了管道ypipe_t来存储命令.而ypipe_t实质上是一个无锁队列,其底层使用了yqueue_t队列,ypipe_t是对yueue_t的再包装,所以 ...

  4. 无锁同步-JAVA之Volatile、Atomic和CAS

    1.概要 本文是无锁同步系列文章的第二篇,主要探讨JAVA中的原子操作,以及如何进行无锁同步. 关于JAVA中的原子操作,我们很容易想到的是Volatile变量.java.util.concurren ...

  5. 使用CAS实现无锁的SkipList

    无锁 并发环境下最常用的同步手段是互斥锁和读写锁,例如pthread_mutex和pthread_readwrite_lock,常用的范式为: void ConcurrencyOperation() ...

  6. java多线程无锁和工具类

    1 无锁 (1) cas (compare and swap) 设置值的时候,会比较当前值和当时拿到的值是否相同,如果相同则设值,不同则拿新值重复过程:注意,在设置值的时候,取值+比较+设值 是一条c ...

  7. C++性能榨汁机之无锁编程

    C++性能榨汁机之无锁编程 来源 http://irootlee.com/juicer_lock_free/ 前言 私以为个人的技术水平应该是一个螺旋式上升的过程:先从书本去了解一个大概,然后在实践中 ...

  8. 【漫画】CAS原理分析!无锁原子类也能解决并发问题!

    本文来源于微信公众号[胖滚猪学编程].转载请注明出处 在漫画并发编程系统博文中,我们讲了N篇关于锁的知识,确实,锁是解决并发问题的万能钥匙,可是并发问题只有锁能解决吗?今天要出场一个大BOSS:CAS ...

  9. 无锁机制----比较交换CAS Compare And Swap

    一.锁与共享变量 加锁是一种悲观的策略,它总是认为每次访问共享资源的时候,总会发生冲突,所以宁愿牺牲性能(时间)来保证数据安全. 无锁是一种乐观的策略,它假设线程访问共享资源不会发生冲突,所以不需要加 ...

  10. MySQL 8.0:无锁可扩展的 WAL 设计

    这篇文章整理自MySQL官方文档,介绍了8.0在预写式日志上实现上的修改,观点总结如下: 在8.0以前,为了保证flush list的顺序,redo log buffer写入过程需要加锁,无法实现并行 ...

随机推荐

  1. 通过Demo学WPF—数据绑定(二)

    准备 今天学习的Demo是Data Binding中的Linq: 创建一个空白解决方案,然后添加现有项目,选择Linq,解决方案如下所示: 查看这个Demo的效果: 开始学习这个Demo xaml部分 ...

  2. .NET 云原生架构师训练营(模块二 基础巩固 MVC终结点)--学习笔记

    2.3.4 Web API -- MVC终结点 MVC与MVVM 模型绑定 自定义模型绑定器 模型验证 返回数据处理 MVC与MVVM MVC ASP.NET Core MVC 概述:https:// ...

  3. 深入浅出 Application Insights--学习笔记

    摘要 介绍如何将 Application Insights 用于生产上实践,并透过它发现/诊断问题.同时也会介绍如何将 Application Insighs 与其他体系相集成实现 Devops(与发 ...

  4. MySQL最左匹配原则

    最左匹配原则都是针对联合索引来说的,那么为什么要使用联合索引呢? 一.为什么要使用联合索引? 1.减少开销. 建一个联合索引(col1,col2,col3),实际相当于建了(col1),(col1,c ...

  5. [Java][Spring]spring profile与maven profile多环境管理

    spring profile 与 maven profile 多环境管理 spring profile Spring profile是Spring提供的多环境管理方案. 如下图: 每种环境都对应一个y ...

  6. 机器学习基础01DAY

    数据的特征抽取 现实世界中多数特征都不是连续变量,比如分类.文字.图像等,为了对非连续变量做特征表述,需要对这些特征做数学化表述,因此就用到了特征提取. sklearn.feature_extract ...

  7. 使用mail发送邮件

    使用mail发送邮件 ​ 只做个简单介绍,使用场景不多 1.安装mail yum install mailx -y 2.配置 ​ 1)配置文件在/etc/mail.rc,有兴趣的可以仔细读一下默认的配 ...

  8. js 实现call和apply方法,超详细思路分析

    壹 ❀ 引 我在 五种绑定策略彻底弄懂this 一文中,我们提到call,apply,bind属于显示绑定,这三个方法都能直接修改this指向.其中call与apply比较特殊,它们在修改this的同 ...

  9. spring boot+sqlite+mybatis实现增删改查例子

    主要是更换了下sqlite的数据源而已,其他代码不变. 我都贴一下吧,这个算是比较通用的基础增删改查代码. 1.创建test.db 可以使用Idea自带的Database插件配置,也可以命令行创建,具 ...

  10. win32-UpdateLayeredWindow

    创建半透明的窗口,以及在窗口上绘制不透明的文本 方法: 创建Bitmap具有PixelFormat32bppPARGB像素格式的GDI + 对象. 创建一个Graphics对象以绘制该Bitmap对象 ...