zoukankan      html  css  js  c++  java
  • ypipe, zmq的核心部件,并行读写的管道。

    必须指出,并行读写只限于单个读跟单个写之间,读与读,还有写与写之间必须确保同步。所以ypipe不必读写锁rwlock,但需要读锁跟写锁两个锁。

    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



  • 相关阅读:
    按钮,文本框
    d01
    第一天,对于课程和工作的了解
    javaweb概念性知识
    Jdbc概念性知识
    连接数据库,和数据增删改
    oracle基础概念性知识
    面向对象java知识汇总题
    javaweb
    date日期
  • 原文地址:https://www.cnblogs.com/bbqzsl/p/13768347.html
Copyright © 2011-2022 走看看