博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
std::shared_ptr之deleter的巧妙应用
阅读量:6251 次
发布时间:2019-06-22

本文共 1018 字,大约阅读时间需要 3 分钟。

本文由作者邹启文授权网易云社区发布。

std::shared_ptr

一次创建,多处共享,通过引用计数控制生命周期。
实例
在邮箱大师PC版中,我们在实现搜索时,大致思路是这样的:
每一个账号都有一个SearchFlow,搜索开始后,所有SearchFlow一起并发搜索,
当全部SearchFlow通过callback返回后,意味着搜索结束。
方案:
搜索前,使用std::set<int64_t> accounts记录那些并发搜索的账号,
当某个账号搜索完成时,在callback中从accounts移除这个账号,
那么,当accounts为空时,表示整个搜索过程结束。
问题,假如搜索过程中,某个账号被删除了,其callback不会返回,那么,怎么保证搜索流程全部结束呢?
std::shared_ptr在这种情况下就派出了用场,而且非常巧妙。

std::shared_ptr
shared_ref_count((void*)0, [](void*){ // end }); for(int i = 0; i < 5; i++){ auto callback = base::Bind([shared_ref_count](){}); auto flow = new SearchFlow(callback); flow->Search(key); }

别忘了,std::shared_ptr的构造函数中提供了一个Deleter,可以让我们自己来释放对象,而我们就在这里执行搜索结束后的代码。

SearchFlow在执行结束后销毁,或者当账号被删除后直接销毁,那么,保存在callback(注:callback是SearchFlow的成员变量)中的shared_ref_count也会销毁,其引用计数-1,当所有SearchFlow都销毁(正常或非正常)后,shared_ref_count引用计数为0,此时,Deleter就执行了。
总结
std::shared_ptr的引用计数原本是其内部为了控制生命周期使用,但是,在这里我们却巧妙的利用引用计数来追踪“散发出去”Flow的踪迹,间接观察Flow的生命周期,从而实现一个源头分散出去,最终归于一点的解决方案。

更多网易技术、产品、运营经验分享请访问网易云社区。

文章来源:

转载地址:http://rwfsa.baihongyu.com/

你可能感兴趣的文章
P1578 奶牛浴场
查看>>
sqlite 数据库错误 The database disk image is malformed database disk image
查看>>
解决MySQL导入中文乱码
查看>>
11、多线程(三) -- 线程池
查看>>
生成APK时,报错处理
查看>>
简单易懂,原码,补码,反码
查看>>
Postman教程
查看>>
阿里巴巴三板斧
查看>>
谁的青春不迷茫
查看>>
java嵌套类(Nested Classes)总结
查看>>
xming + putty 搭建远程图形化ssh访问ubuntu 14.04
查看>>
php 自带过滤和转义函数
查看>>
javascript一些小技巧
查看>>
android 使用HttpURLConnection方式提交get/post请求
查看>>
CTR预估中GBDT与LR融合方案
查看>>
I00024 出钱买羽
查看>>
原生js实现点击下载图片
查看>>
WinCE winform 开发注意事项
查看>>
linux下文件的一些文件颜色的含义
查看>>
OLTP系统的Oracle RAC性能调优,索引分区极大提升提交性能
查看>>