2016-11-06 38 views
0

我正在閱讀關於Asio的一些答案,並且在SO中的示例和here中引人注目的模式是使用單個io_service並在可以通過套接字處理打開,發送和接收消息的工作人員之間共享。在多個線程上使用單個io_service有什麼好處?

在多個套接字抽象之間共享io_service是否有任何好處?爲什麼不讓每個人都擁有自己的io_service?

+0

資源。你應該嘗試找到現有的答案,因爲它經常被問到 – sehe

+0

我通常使用的模式是對所有關鍵工作都有一個主要的io_service,它有多個線程分派。還有一個用於後臺的輔助io_service(管理任務/套接字等),通常由單個線程處理。這種分離使我能夠控制例如事情發生的地方 - 並且對非關鍵活動進行優先排序......但它取決於你的情況。 – Nim

回答

1

據我瞭解,io_service「擁有」資源。如果您有一個io_service處理所有asio函數,那麼您可以管理優先級。如果你有多個io_service實例,所有「擁有」相同的資源,那麼它們會發生衝突。

+0

這不是真的那樣。例如。如果你有一個套接字,這個套接字不是由'io_service'永久擁有的。您可以自由使用一個'io_service'來寫數據,另一個來讀數據。或者通過多個io_services執行連續的異步讀取。基本上等於將套接字從一個io_service移動到另一個。你不應該做的事情是通過多個io_services在資源上進行併發操作。 – Matthias247

0

我嘗試過這種模式,並不建議您再使用它只期望一些非常特定的場景。相反,如果您需要,我建議「始終只使用一個套接字io_service」方法,並使用多個io_services(每個都在專用線程中運行)。

原因是,如果您從多個線程使用一個io_service,則可以從任何參與線程調用所有回調(完成處理程序),並且必須爲它們提供其他同步。在「資源屬於一個正在一個線程上執行的io_service」模型中,您不需要這樣做,因爲沒有併發處理程序將從另一個線程執行。

相關問題