2009-02-18 102 views
3

我想實現一個簡單的發佈/訂閱模式,其中:發佈/訂閱和智能指針

單個發佈者發佈的令牌(一個指向對象)到它的用戶。發佈者和訂閱者都是獨立的線程。我打算爲每個訂閱者添加線程安全隊列,以便Publisher在處理令牌時可以繼續向訂閱者分發令牌。你可以看到,這意味着所有的訂閱者實際上都共享相同的指針(注意:訂閱者無法修改指向的對象,所以沒有問題)。一旦共享指針不再被任何訂閱者使用,如果指針可以在最後一個訂閱者線程完成後自動刪除自己,那將非常好。

這是一個使用智能指針的好地方嗎?如果是這樣,我應該使用哪些智能指針?

我使用MSVC2008在Windows上開發,並使用Intel TBB,Boost和Qt。

回答

4

如果我假設你的設計是可行的(它在零上下文中很有趣,但很可能是正確的),boost :: shared_ptr可能是一條可行的路。

http://www.boost.org/doc/libs/1_38_0/libs/smart_ptr/smart_ptr.htm

編輯:切換到::從:: weak_ptr的shared_ptr的,因爲我是一個白癡...

+0

boost :: weak_ptr不適用於他的場景,除非發佈者保證在最後一個訂閱者完成之前保持對象活着。這對於異步隊列來說是不可行的。 – 2009-02-18 08:02:53

4

你描述的是對象的生命週期控制傳統的COM模式。您需要一個智能指針,用於保持對象上的參考計數器 - boost::shared_ptr,boost::intrusive_ptr或ATL的CComPtr類。我建議shared_ptr,因爲其他兩個將需要您自己的參考計數實施。