2014-12-04 52 views
3

我創建一個共享庫,以及創建構造函數中的線程它運行它,直到調用析構函數的類。這個類的所有方法都是線程安全的。事情是這樣的:在共享庫中創建線程是不好的做法嗎?

class NetworkRPCConnection { 
    std::thread t; 
public: 
    NetworkRPCConnection() : t([](){maintain_connection();}) {} 
    ~NetworkRPCConnection(){close_connection(); t.join();} 
} 

這工作得很好,但它是不好的做法,在共享庫中創建一個線程?在API文檔中值得一提的是,還是隱藏這個實現細節更好?

+3

絕對在API中記錄它。 – randomusername 2014-12-04 21:05:05

+0

那麼,我讀的所有書籍都說,實現細節應該隱藏在文檔之外。爲什麼開發人員想知道,如果庫使用線程? – 2014-12-04 21:08:02

+1

開發人員需要知道,因爲他們可能會使用線程,如果別的東西正在使用它們,那麼這對資源來說就更加緊張。另外,線程通常需要特殊的構建配置和選項才能融入到構建系統中。 – randomusername 2014-12-04 21:13:34

回答

7

一般來說,最好避免在共享庫中創建線程,但有些情況下,這是確定 - 但在這種情況下,你真的需要你的API中記錄下來。

需要記錄它的原因是,線程可以在硬交互預測與某些操作方式 - 尤其是fork()和信號;這使得將線程完全「隱藏」爲實現細節是不可能的,因爲庫用戶需要知道它。至於爲什麼最好不要創建線程:通常庫的用戶對線程模型有更好的理解 - 例如,他們可能已經有了一個可以完成工作的線程,所以創建另一個線程只會產生額外的開銷(並限制其實施)。但是,如果您非常瞭解庫的用戶需求,並且知道需要專用線程,並且可以處理線程生命週期的所有方面 - 那麼可以自行創建和管理線程 - 但是,如上所述,你肯定需要記錄它。

相關問題