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,在此可以執行我們的下一步處理了。