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

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的巧妙应用的更多相关文章

  1. std::shared_ptr(二)

    Defined in header <memory>       template< class T > class shared_ptr;   (since C++11)   ...

  2. std::shared_ptr<void>的工作原理

    前戏 先抛出两个问题 如果delete一个指针,但是它真实的类型和指针类型不一样会发生什么? 是谁调用了析构函数? 下面这段代码会发生什么有趣的事情? // delete_diff_type.cpp ...

  3. 智能指针思想实践(std::unique_ptr, std::shared_ptr)

    1 smart pointer 思想 ​ 个人认为smart pointer实际上就是一个对原始指针类型的一个封装类,并对外提供了-> 和 * 两种操作,使得其能够表现出原始指针的操作行为. ​ ...

  4. std::shared_ptr

    在std::shared_ptr被引入之前,C++标准库中实现的用于管理资源的智能指针只有std::auto_ptr一个而已.std::auto_ptr的作用非常有限,因为它存在被管理资源的所有权转移 ...

  5. (译+原)std::shared_ptr及std::unique_ptr使用数组

    转载请注明出处: http://www.cnblogs.com/darkknightzh/p/5462363.html 参考网址: http://stackoverflow.com/questions ...

  6. 巧用std::shared_ptr全局对象释放单例内存

    巧用std::shared_ptr 单例的使用相对比较广泛,但是需要在程序退出前调用它的析构函数对数据进行释放,常规做法是在main函数末尾进行释放工作, 但是这样相对比较繁琐,因此便有了利用全局变量 ...

  7. tolua 转换 std::shared_ptr

    tolua 转换 std::shared_ptr 自从c++11以后std::shared_ptr几乎是比用的东西,经常会遇到类似如下应用 std::shared_ptr<Tst_ShareTe ...

  8. Item 20: 使用std::weak_ptr替换会造成指针悬挂的类std::shared_ptr指针

    本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 矛盾的是,我们很容易就能创造出一个和std::shared_ptr ...

  9. std::shared_ptr 和普通指针的转换

    相互转化见示例 struct test { int num; string name; }; test* pTest = new test(); std::shared_ptr<test> ...

随机推荐

  1. docker-ubuntu镜像,nginx镜像

    docker 是将程序与机器隔开,使程序不受环境影响. 安装 sudo apt-get install docker.io ## 好用的一些命令 1.停用全部运行中的容器: docker stop $ ...

  2. IOS 文件解析

    import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java ...

  3. MobaXterm 错行,乱码

    最近使用MobaXterm ssh,发现进入ssh显示中文没问题.但如果用VIM编辑文件时如果有中文,修改插入操作有时就会有串行乱码情况,改vim编码也不行.都没有完美解决.最后发现只需要在MobaX ...

  4. BashProfile

    [BashProfile] ~/.bash_profile. alias ll='ls -l -G -a' alias gp='grep --colour -R'

  5. Linux基石【第四篇】基本Linux命令

    Linux 系统上一切皆文件 命令: pwd  -- 查看当前目录  / 代表根目录 clear -- 清屏命令 cd(change directory) -- 切换目录 cd / -- 切换到根目录 ...

  6. SQL Server判断数据库、表、存储过程、函数是否存在

    --判断数据库是否存在 if exists (select * from sys.databases where name = '数据库名') drop database [数据库名] --判断表是否 ...

  7. Add Strings大整数加法十进制求和 & Add Binary二进制求和

    [抄题]: 以字符串的形式给出两个非负整数 num1 和 num2,返回 num1和 num2 的和. 比如一个50位+一个100位. 给定 num1 = "123",num2 = ...

  8. 23-python用BeautifulSoup用抓取a标签内所有数据

    1.获取子标签: thr_msgs = soup.find_all('div',class_=re.compile('msg'))   for i in thr_msgs:     print(i) ...

  9. Disruptor 系列(二)使用场景

    Disruptor 系列(二)使用场景 今天用一个订单问题来加深对 Disruptor 的理解.当系统中有订单产生时,系统首先会记录订单信息.同时也会发送消息到其他系统处理相关业务,最后才是订单的处理 ...

  10. dojoConfig包的配置(7/26号夜)

    主页代码: <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> ...