理解 shared_ptr实现copy-on-write(COW)
来源:互联网 发布:淘宝卖家代理 编辑:程序博客网 时间:2024/06/07 22:56
shared_ptr实现COW(Copy-On-Write)
前不久在《Linux多线程服务端编程使用muduoC++网络库》2.8节看到这个内容,一直没有真正理解,后来在书中7.3中再次提到使用shared_ptr实现copy-on-write的手法降低锁竞争,从shared_ptr的层面,彻底理解了一番。
之前copy-on-write详解分享中知道了其含义与过程,后又在StackOverFlow上学到了COW技术的精髓:
1.如果你是数据的唯一拥有者,那么你可以直接修改数据。
2.如果你不是数据的唯一拥有者,那么你拷贝它之后再修改。
用shared_ptr来实现COW时,主要考虑两点:
1.读数据
2.写数据
shared_ptr拥有对对象的引用计数,在对对象进行读写操作时,这个计数是1,当读数据时,我们创建一个新的智能指针指向原指针,这个时候引用计数加1。
//假设g_ptr是一个全局的shared_ptr<Foo>并且已经初始化。void read(){ shared_ptr<Foo> tmpptr; { lock(); tmpptr=g_ptr;//此时引用计数为2,通过gdb调试可以看到 } //访问tmpptr //...}
这部分是shared_ptr最基本的用法,还是很好理解的,read()函数调用结束,tmpptr
作为栈上变量离开作用域,自然析构,原数据对象的引用计数也变为1。
写数据就复杂一些。根据COW的准则,当你是唯一拥有者(对应对象的引用计数是1)时,那么你直接修改数据,这样没有问题,当你不是唯一拥有者,则需要拷贝数据再去修改,这就需要用到一些shared_ptr的编程技法了:
void write(){ lock() if(!g_ptr.unique()) { g_ptr.reset(new Foo(*g_ptr)); } assert(g_ptr.unique()); //write //}
解释一下代码: shared_ptr::unique()
,当引用计数为1时返回true,否则false。
那么当引用计数不为1的时候,说明有别的线程正在读,受shread_ptr::reset()中example的误导,一直以为,reset后,原对象被析构,这样不就会影响正在读的线程了吗?
实际上:
假设一个线程读,一个线程写,当写线程进入到if循环中时,原对象的引用计数为2,分别为tmpptr
和g_ptr
,此时reset()
函数将原对象的引用计数减1,并且g_ptr
已经指向了新的对象(用原对象构造),这样就完成了数据的拷贝,并且原对象还在,只是引用计数变成了1。
- 理解 shared_ptr实现copy-on-write(COW)
- 借shared_ptr实现copy-on-write
- Copy-on-write(COW)
- linux的COW(Copy-On-Write)
- COW(copy on write)探析
- Snapshot:COW(copy on write)
- C++ string 类 部分成员函数实现(实现COW copy-on-write)
- 复合类型中的COW(copy on write)
- Linux系统中的copy-on-write(COW)技术
- COW copy on write linux 开博啦。哈哈
- Copy-On-Write COW 技术简介
- 借shared_ptr实现copy on write 以减少锁的使用
- 借助shared_ptr实现copy-on-write以提高多线程并发性能
- C++ string 类 部分成员函数实现(实现COW copy-on-write+实现智能指针(有极大bug版本))
- 写时拷贝(copy-on-write) COW技术
- PHP学习:foreach的深入 和COW(copy-on-write )的验证
- babyos2(13)——进程页表,fork, COW(copy on write)
- Linux写时拷贝技术(copy-on-write)--COW
- Java毕业设计------基于java web的在线教学交流平台
- 基于cow的shadowsocks二级网络代理实现
- 洛谷 P1983 车站分级
- AngularJS的依赖注入方式
- scala-for循环
- 理解 shared_ptr实现copy-on-write(COW)
- 洛谷 P1330 封锁阳光大学
- android fragment切换
- C#对象序列化与反序列化
- Canva画布类的常用方法总结
- Introduction to Programming with c++ 9-2 一个标准的基于对象的入门例子
- java类的构造方法和方法重载
- 5.注解扫描
- android json数据解析(二)