摘要:一次創建,多處共享,通過引用計數控制生命周期。方案搜索前,使用記錄那些并發搜索的賬號,當某個賬號搜索完成時,在中從移除這個賬號,那么,當為空時,表示整個搜索過程結束。更多網易技術產品運營經驗分享請訪問網易云社區。文章來源網易云社區
本文由作者鄒啟文授權網易云社區發布。
std::shared_ptr
一次創建,多處共享,通過引用計數控制生命周期。
實例
在郵箱大師PC版中,我們在實現搜索時,大致思路是這樣的:
每一個賬號都有一個SearchFlow,搜索開始后,所有SearchFlow一起并發搜索,
當全部SearchFlow通過callback返回后,意味著搜索結束。
方案:
搜索前,使用std::set
當某個賬號搜索完成時,在callback中從accounts移除這個賬號,
那么,當accounts為空時,表示整個搜索過程結束。
問題,假如搜索過程中,某個賬號被刪除了,其callback不會返回,那么,怎么保證搜索流程全部結束呢?
std::shared_ptr在這種情況下就派出了用場,而且非常巧妙。
std::shared_ptrshared_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://m.specialneedsforspecialkids.com/yun/25328.html
閱讀 2875·2021-11-11 10:58
閱讀 1932·2021-10-11 10:59
閱讀 3499·2019-08-29 16:23
閱讀 2347·2019-08-29 11:11
閱讀 2794·2019-08-28 17:59
閱讀 3845·2019-08-27 10:56
閱讀 2088·2019-08-23 18:37
閱讀 3121·2019-08-23 16:53