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

本文共 1032 字,大约阅读时间需要 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://qhkmo.baihongyu.com/

你可能感兴趣的文章
黑客学习笔记教程之一:黑客文化
查看>>
alias别名、时间、screen、echo等——Linux基本命令(3)
查看>>
Access-Control-Allow-Origin与跨域
查看>>
Python正则表达式详解
查看>>
交换机、路由器设备选型总结
查看>>
linux文件系统介绍
查看>>
find
查看>>
互联网MySQL开发规范
查看>>
android中的按钮以图片的方式显示_基础篇
查看>>
linux indent命令: 调整C原始代码文件的格式
查看>>
snmp之——2交换机MIB库ID和物理端口不对应
查看>>
Centos6.7下安装python连接mysql环境故障解决
查看>>
12.交换路由密码恢复
查看>>
sudo:sorry,you must have a tty to run sudo
查看>>
python os模块
查看>>
服务器操作系统之Solaris架构攻略
查看>>
java——演示封装的思想
查看>>
直接使用提交过来的类来更新字段EntityState.Modified并过滤null值的方法
查看>>
美团在Redis上踩过的一些坑-5.redis cluster遇到的一些问题
查看>>
浅谈JAVA的线程安全与性能之间的权衡
查看>>