std::shared_ptr之deleter的巧妙应用
本文由作者邹启文授权网易云社区发布。
std::shared_ptr
一次创建,多处共享,通过引用计数控制生命周期。
实例
在邮箱大师PC版中,我们在实现搜索时,大致思路是这样的:
每一个账号都有一个SearchFlow,搜索开始后,所有SearchFlow一起并发搜索,
当全部SearchFlow通过callback返回后,意味着搜索结束。
方案:
搜索前,使用std::set<int64_t> accounts记录那些并发搜索的账号,
当某个账号搜索完成时,在callback中从accounts移除这个账号,
那么,当accounts为空时,表示整个搜索过程结束。
问题,假如搜索过程中,某个账号被删除了,其callback不会返回,那么,怎么保证搜索流程全部结束呢?
std::shared_ptr在这种情况下就派出了用场,而且非常巧妙。
std::shared_ptr<void> 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的生命周期,从而实现一个源头分散出去,最终归于一点的解决方案。
更多网易技术、产品、运营经验分享请访问网易云社区。
相关文章:
【推荐】 交互设计师如何做运营需求-以网易严选邀请新人功能设计为例
【推荐】 测试环境docker化—容器集群编排实践
【推荐】 致传统企业朋友:不够痛就别微服务,有坑 (1)
std::shared_ptr之deleter的巧妙应用的更多相关文章
- std::shared_ptr(二)
Defined in header <memory> template< class T > class shared_ptr; (since C++11) ...
- std::shared_ptr<void>的工作原理
前戏 先抛出两个问题 如果delete一个指针,但是它真实的类型和指针类型不一样会发生什么? 是谁调用了析构函数? 下面这段代码会发生什么有趣的事情? // delete_diff_type.cpp ...
- 智能指针思想实践(std::unique_ptr, std::shared_ptr)
1 smart pointer 思想 个人认为smart pointer实际上就是一个对原始指针类型的一个封装类,并对外提供了-> 和 * 两种操作,使得其能够表现出原始指针的操作行为. ...
- std::shared_ptr
在std::shared_ptr被引入之前,C++标准库中实现的用于管理资源的智能指针只有std::auto_ptr一个而已.std::auto_ptr的作用非常有限,因为它存在被管理资源的所有权转移 ...
- (译+原)std::shared_ptr及std::unique_ptr使用数组
转载请注明出处: http://www.cnblogs.com/darkknightzh/p/5462363.html 参考网址: http://stackoverflow.com/questions ...
- 巧用std::shared_ptr全局对象释放单例内存
巧用std::shared_ptr 单例的使用相对比较广泛,但是需要在程序退出前调用它的析构函数对数据进行释放,常规做法是在main函数末尾进行释放工作, 但是这样相对比较繁琐,因此便有了利用全局变量 ...
- tolua 转换 std::shared_ptr
tolua 转换 std::shared_ptr 自从c++11以后std::shared_ptr几乎是比用的东西,经常会遇到类似如下应用 std::shared_ptr<Tst_ShareTe ...
- Item 20: 使用std::weak_ptr替换会造成指针悬挂的类std::shared_ptr指针
本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 矛盾的是,我们很容易就能创造出一个和std::shared_ptr ...
- std::shared_ptr 和普通指针的转换
相互转化见示例 struct test { int num; string name; }; test* pTest = new test(); std::shared_ptr<test> ...
随机推荐
- python twilio 短信群发 知识留存
1. win7 32位系统,傻瓜安装Anaconda2(python 2.7) 2. 打开cmd, 输入命令pip install twilio,在线安装twilio 3. 打开Anaconda2的S ...
- 几种查询方法(lambda Linq Enumerable静态类方式)
1.需要一个数据源类: using System; using System.Collections.Generic; namespace Linq { public class Student { ...
- CentOS+Tomcat环境搭建
此次搭建是基于: CentOS release 5.6 (Final) Kernel \r on an \m 搭建准备:http://pan.baidu.com/s/1pLt1lLh apache-t ...
- Vim中nerdtree配置
nerdtree nerdtree,就是一个文件树目录. 配置脚本 "文件树 Plug 'scrooloose/nerdtree' Plug 'Xuyuanp/nerdtree-git-pl ...
- 11. Container With Most Water 装水最多的容器
[抄题]: Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, ...
- ubuntu下安装最新的nodejs
# apt-get update # apt-get install -y python-software-properties software-properties-common # add-ap ...
- 转载:字符串hash总结(hash是一门优雅的暴力!)
转载自:远航休息栈 字符串Hash总结 Hash是什么意思呢?某度翻译告诉我们: hash 英[hæʃ] 美[hæʃ]n. 剁碎的食物; #号; 蔬菜肉丁;vt. 把…弄乱; 切碎; 反复推敲; 搞糟 ...
- 界面设计中如何增强CTA按钮召唤力?
以下内容由Mockplus(摹客)团队翻译整理,仅供学习交流,Mockplus是更快更简单的原型设计工具. 网页和软件应用之类数字产品的有效交互系统一般是由拥有各种任务和功能的小元素构成.而为创建更加 ...
- 斜杠反斜杠,去空格\xa0,连接函数join()
1斜杠反斜杠 斜杠:/.反斜杠:\. 反斜杠\,在windows系统中用来表示目录. 而在unix系统中,/表示目录.由于web遵循unix命名,所以在网址(URL)中,/表示目录. 在unix系统中 ...
- 《Python自动化测试修炼宝典》线上课程已经成功入驻网易云课堂......
<Python自动化测试修炼宝典>线上课程已经成功入驻网易云课堂...... IT测试老兵利用工作之余,亲自录制的<Python自动化测试修炼宝典>线上课程已经成功入驻网易云课 ...