2013-02-20 168 views
3

當使用boost :: asio進行一些異步TCP通信時,我注意到它啓動了很多(3-4)內部線程。在the documentation閱讀,它說boost :: asio內部線程

"The implementation of this library for a particular platform may 
make use of one or more internal threads to emulate asynchronicity" 

現在我的lib有着嚴格的要求,以不啓動任何額外的線程(除了由客戶提供的,現在它也開始io_service::run()一個)。有沒有什麼辦法可以停止boost :: asio來創建這些額外的線程?

另外,是否有任何其他的異步庫,只能在一個線程中運行?

回答

5

您可以通過在相應的轉換單位中定義BOOST_ASIO_DISABLE_THREADS來禁用仿真的異步操作支持。 The documentation有這樣說的定義

Explicitly disables Boost.Asio's threading support, independent of whether or not Boost as a whole supports threads.

如果你沒有找到platform specific implementation notes,它明確指出哪些操作使用該仿真。例如我幾乎在每個平臺上都知道async_resolve()是以這種方式模擬的,線程是在第一次調用async_resolve()時創建的。一些(所有?)Windows平臺模擬其他幾個操作,例如deadline_timer操作。

禁用線程支持的一種替代方法可能是避免這些模擬操作。我個人沒有在項目中使用BOOST_ASIO_DISABLE_THREADS,所以我不確定它是否有其他副作用。

+2

當定義了'BOOST_ASIO_DISABLE_THREADS'時,Asio在嘗試產生一個線程時拋出'boost :: asio :: error :: operation_not_supported'錯誤。因此,唯一的選擇是避免線程產卵操作。在大多數實現中,這可以通過使用'resolve()'而不是'async_resolve()'來完成。在Windows上,定義'BOOST_ASIO_DISABLE_IOCP'將導致Asio使用基於選擇的實現,該實現比較慢,但不應該產生額外的線程。 – 2013-02-20 16:01:00

+0

謝謝,實際上我根本沒有找到這個文檔。我將嘗試使用DISABLE_IOCP – Rolle 2013-02-20 16:05:56

1

您是否真的測試過它,以查看線程是否在您的特定平臺上生成?如果沒有,問題解決!如果有的話,你可能會考慮像libevent或libev這樣的不同的圖書館。無論是那些,還是由像Qt這樣的各種庫提供的一大堆其他異步事件循環都可以工作。

+0

是的,我看到他們產卵。此外,這個lib被移植到許多平臺 – Rolle 2013-02-20 15:01:58