std::shared_ptr的巧妙應用

std::shared_ptr

一次創建,多處共享,通過引用計數控制生命週期。

問題:

假設有一項任務Task,其分爲N個小模塊,每個小模塊都是併發執行。

現在要求,任務開始,每個小模塊併發執行,在全部小模塊執行完後,將所有小模塊結果進行下一步處理,任務結束。

方案一:

任務開始,先創建一個成員變量std::set<Span*> n_span;(這裏Span代表一個小模塊,異步執行模塊的功能);

將每個小模塊都記錄在n_span中;

當小模塊執行完後,從n_span中移除;

當n_span爲空時,意味着所有小模塊都執行完畢,可以繼續下一步處理了。

方案一看起來簡單清晰,那麼其存在什麼問題呢?

假如某個小模塊因爲某種原因被銷燬了,那麼,其模塊便不會返回,Task就會永遠lost,永遠不會繼續下一步處理了。

*****std::shared_ptr閃亮登場*****

在使用std::shared_ptr時,我們很少注意到,其構造函數有兩個參數,

第一個是對象指針,

第二個是deleter,可以讓我們自己定義其析構函數。

auto next = [](){};
std::shared_ptr<void> shared_count((void*)0, [next](void*){ next() });
for(int i = 0; i < N; i++){
    Span* s = new Span(shared_count);
    s->Run();  // Span在執行結束後delete this
}
無論Span是正常還是非正常結束,保存在Span中的std::shared_ptr<void>銷燬後都會導致shared_count引用計數-1,當引用計數爲0時,其執行了我們定義的deleter,在此可以執行我們的下一步處理了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章