2012-02-16 64 views
0

我正在開發基於Boost :: Asio的網絡服務器。阻止提升Asio工作線程

我有我使用調用IO工作線程的boost::thread_groupboost::asio::io_service::run()

當網絡活動發生ASIO使用這些工作線程以處理活動中的一個(例如,接受或接收)。

我的應用程序然後做了一些工作,可能是一些計算,可能還有一些其他的IO(通過boost)以及可能的一些數據庫活動。

我想知道在這些線程中做所述工作的含義。具體做法是:

  • 是否在IO線程導致 的io_service任何悲痛執行(可能顯著工作)?

而不是特別的:我應該考慮的任何其他問題。

+1

我不清楚你是什麼意思,通過從工作者線程回調'boost :: asio'。我希望所有的工作線程都將其他工作添加到'io_service'中,否則事件處理循環('io_service :: run()')將終止。 – 2012-02-16 22:43:32

+0

@Sam,謝謝 - 我想我可能對這個問題太擔心了。我將編輯該問題。我想我真正關心的是在工作線程中做了太多工作。 – Nick 2012-02-17 08:43:26

回答

1

在IO線程 上執行(可能很重要的工作)是否會導致io_service發生任何悲傷?

這真的取決於你的意思是悲傷。在由io_service調用的處理程序中執行長時間運行操作可以阻止io_service調用其他處理程序。考慮最簡單的例子,用一個線程調用io_service::run()。如果由異步操作(例如async_read())調用的處理程序然後執行一些可能長時間運行的數據庫操作,則額外的未完成異步操作將不會調用它們的處理程序,直到長時間運行操作完成並且處理程序將控制返回到io_service

通常通過從多個線程調用io_service::run()並使用strand來確保獨佔訪問使用共享數據的處理程序,從而緩解這種情況。儘管如果所有的處理程序都執行一些長時間運行的操作,您可能需要研究其他設計。