brpc DoublyBufferedData

ScopedPtr  析构时自动释放,本线程的锁。  保存一个wrapper到本地线程的私有变量里,析构时删除。

双缓冲,空间换时间,一个用来读,一个用来写,写完后切换一下。

_index 保存了读取的对象的下标。bg_index为写的对象的下标。分别为0和1,所以bg_index=!_index

Wrapper 每个读线程一个。读取时,从线程本地变量中读取,如果有,则直接获取。

如果没有,则创建一个Wrapper,set到本地变量中。

_mutex 读线程 时加锁,设置完指针,操作完数据之后,在函数退出时,ScopedPtr析构时才解锁,为何要加锁? 主要是和写线程同步用,写线程要等待读线程都读取完毕后,再更新bgindex指向的变量。 由于写线程是加锁完后马上解锁,所以读线程加锁非常快,无需竞争等待,几乎可以认为是无锁的。

 

AddWrapper中为何要用uniq_ptr 智能指针,函数正常/异常 退出时析构,自动释放,无需加各种goto和是否需要delete的判断。

写时,先写后台的background的那个对象,写完后,更新_index, 切换一下。调用WaitReadDone  加锁 _mutex 再解锁,主要是同步作用,用来等待所有的读线程读取完毕。等待完毕后,再更新之前没有更新的_index,把两份data数据都更新为最新值。

 

更新函数可能有其他的参数,所以封装了两个函数类,用来保存对一个、两个参数的更新函数的调用

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值