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数据都更新为最新值。

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

猜你喜欢

转载自blog.csdn.net/hintonic/article/details/81475076