2009-01-08 50 views
13

與Boost.Asio最近玩了很多。我非常喜歡這個庫,因爲它提供了一種極好的方式來擠出當今多核系統的性能。使用Boost.Asio時確保有效物體使用壽命的最佳方法是什麼?

一個問題,我問了自己幾次,我認爲在與Asio進行異步調用時,值得關注對象的壽命/所有權。

我一再重複討論的問題是,你經常需要「過期」一個仍然有異步回調的對象。如果該對象在調用回調之前超出範圍,事情將不可避免地發生。

爲了解決這個問題,我採用了boost::enable_shared_from_this模板作爲大多數基於asio的類的基類。這工作正常,但有點麻煩:通常這也意味着保護構造函數並向類中添加工廠方法,以確保所有實例都在shared_ptr內創建。

我只是想知道別人怎麼解決這個問題。我是否正在討論這個最好的方法?還是讓我的Asio.Foo都錯了?

討論... :)

回答

1

這種事情並不侷限於短耳。我最近編寫了一個線程池類(使用Boost :: Thread),它具有幾乎相同的問題 - 線程會調用創建它們的線程池類,以便使用普通指針查看接下來要執行的任務並且如果線程池類被一個仍在運行的子線程銷燬,程序就會崩潰。我通過在線程池析構函數中的每個線程上調用interrupt來處理它,然後在讓析構函數返回之前等待它們全部退出。

如果我理解你的共享指針解決方案,它似乎在做同樣的事情 - 確保物品在不再需要之前不會被銷燬。一個美觀的解決方案也。我沒有看到任何更好的答案這種問題。

+0

有意思的是你提到了這種情況:我的同事(在這裏稱爲艾倫)和你一樣做了同樣的事情,我提到了我找到的「解決方案」,因爲對我來說這是同樣的問題。 雖然我仍然不滿意:我不喜歡缺乏決定論,但是,那對於雅 – jkp 2009-01-08 19:54:57

2

使用boost::enable_shared_from_this幾乎可以做到這一點。另外,如果您需要引用不應保留對象的引用(如果它們是唯一保留的引用),請使用boost::weak_ptr

使用weak_ptr的一個很好的例子:我在我的套接字類中使用了enable_shared_from_this,它利用了boost::asioboost::asio框架是唯一通過讀寫處理程序存儲對象的持久引用的東西。因此,當調用套接字的析構函數時,我知道套接字已關閉,並且我可以在處理程序中「執行」來清理該關閉的套接字。使用套接字的應用程序只有一個weak_ptr引用,當它想要使用套接字(通常寫入它)時,它會將其提升爲shared_ptr。當套接字消失時,可以檢查該提升是否失敗,但是在發生這種情況之前,套接字的關閉處理程序通常會適當地清除所有引用。

相關問題