zoukankan      html  css  js  c++  java
  • 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的生命周期,从而实现一个源头分散出去,最终归于一点的解决方案。


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

    相关文章:
    【推荐】 亲近用户—回归本质
    【推荐】 LESS+to+MCSS
    【推荐】 聊一聊整车厂的那些事——售后配件业务

  • 相关阅读:
    Mysql 执行安装脚本报错Changed limits:
    Centos6.6 安装Mysql集群
    Oracle11g RAC+DG搭建
    Oracle用函数或PIVOT实现行转列
    Oracle根据列中的特殊符号进行分组
    Hadoop on Windows with Eclipse -02- Prerequisites
    Hadoop on Windows with Eclipse -01- Introduction
    Hadoop入门之WordCount运行详解
    Hadoop namenode无法启动问题解决
    jar 打包命令详解
  • 原文地址:https://www.cnblogs.com/zyfd/p/10102486.html
Copyright © 2011-2022 走看看