本文由作者鄒啟文授權網易云社區發布。
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)