2011-03-19 72 views
5

好像所有的例子總是顯示在所有線程中運行相同的io_service。boost :: asio在線程中啓動不同的服務?

你可以啓動多個io_services嗎?這是我想做些什麼:

開始io_service對象一個在處理用戶輸入的主線程...

開始在另一個線程的另一個io_service對象B中,然後就可以開始了一堆工人 所有線程共享io_service B.

io_service A上的用戶可以在io_service B上「發佈」工作,以便在工作池上完成工作,但不會在io_service A上完成工作,即主線程。

這可能嗎?這有意義嗎?

謝謝

回答

1

好問題!

是的,它是可能是爲一個。在我目前正在研究的應用程序中,我已將應用程序分解爲負責系統不同方面的單獨組件。每個組件都在自己的線程中運行,具有自己的一組定時器,使用asio執行自己的網絡I/O。從可測試性/設計的角度來看,它似乎對我來說更加乾淨,因爲沒有任何組件可能會干擾到另一個組件,但我會糾正的。我想我可以重寫所有傳入io服務的參數作爲參數,但目前還沒有發現需要這樣做。所以回到你的問題,你可以做任何你想做的事情,海事組織更是一個嘗試它的案例,如果遇到任何問題,就更改它。

此外,你可能想看看什麼山姆·米勒在不同的崗位WRT處理用戶輸入指出的(也就是說,如果您使用的是控制檯):https://stackoverflow.com/questions/5210796/boost-asio-how-to-write-console-server

+0

+1鏈接到我的答案顯示posix :: stream_descriptor的用法。 – 2011-03-19 14:21:24

2

根據我的經驗,它真的取決於應用程序,如果每個cpu或每個進程的io_service性能更好。幾年前在這個話題上討論了asio-users郵件列表。

Boost.Asio文檔在HTTP Server 2和HTTP Server 3示例中有一些很好的示例showing these two技術。但請記住,第二臺HTTP服務器只是展示瞭如何使用這種技術,而不是何時或爲何使用它。這些問題需要通過分析您的應用程序來解答。

在一般情況下,你應該創建一個使用Boost.Asio的

  1. 單線程
  2. 線程池與單個io_service
  3. io_service對象帶有某種CPU親和力
  4. 的應用程序時,使用下面的命令
+0

+1有趣的討論:),讓我懷疑我的系統設計,雖然我還沒有遇到任何問題。 – Ralf 2011-03-19 16:04:28

+0

這是情況,我有一個應用程序有一個線程和一個處理套接字和stdio的io_service,它是舊的非線程保存代碼。現在我想添加一個工作線程池,它擁有自己的io_service,並且不會與主線程上的非線程安全代碼交互。工作池將在單獨的數據上運行一些單獨的代碼,通信將通過主線程io_service和線程池中運行的io_service之間的io_service帖子進行。聽起來可以這樣做? – 2011-03-19 22:02:48

+0

@Oliver是的,這聽起來像是可以做到的。但是,如果這是我的任務,我會用線索修復非線程安全的代碼,並使用帶有線程池的單個io_service調用io_service :: run()。 – 2011-03-20 13:23:57