日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

std::shared_ptr之deleter的巧妙应用

發布時間:2023/12/19 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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都銷毀(正?;蚍钦?#xff09;后,shared_ref_count引用計數為0,此時,Deleter就執行了。?
總結?
std::shared_ptr的引用計數原本是其內部為了控制生命周期使用,但是,在這里我們卻巧妙的利用引用計數來追蹤“散發出去”Flow的蹤跡,間接觀察Flow的生命周期,從而實現一個源頭分散出去,最終歸于一點的解決方案。


更多網易技術、產品、運營經驗分享請訪問網易云社區

相關文章:
【推薦】?交互設計師如何做運營需求-以網易嚴選邀請新人功能設計為例
【推薦】?測試環境docker化—容器集群編排實踐
【推薦】?致傳統企業朋友:不夠痛就別微服務,有坑 (1)

總結

以上是生活随笔為你收集整理的std::shared_ptr之deleter的巧妙应用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。