2011-02-27 30 views
1

我寫使用Boost短耳服務器應用程序只有一個插座:升壓短耳,io_service對象處理每個核心

  1. 服務器:)從線程池(每個核心一個線程)運行io_service.run(,接受連接從套接字讀取數據是異步完成的。
  2. 客戶端:每個客戶端連接併發送大量文件(〜500MB)到服務器。

問題:所有客戶端都連接到服務器(客戶端數量>服務器核心數量); io_service每個線程只處理一個連接/套接字,而來自其他套接字的數據不會被處理,直到其中一個處理的連接完成。

我希望來自所有連接套接字的數據能夠被io_service線程池同時處理?

回答

1

預期的行爲是什麼?如果您有n線程調用io_service::run(),您的io_service只能調用n處理程序。如果未完成異步操作的數量大於n,則它們的處理程序將在io_service隊列中等待,直到線程可以自由調用它們。

+0

我期望來自所有連接的客戶端的數據被線程池處理(以較低的速率),而不是簡單地阻止等待一個線程的所有其他客戶端變爲空閒。這意味着一個連接在整個數據傳輸過程中佔用一個線程,即使我從套接字異步讀取數據(這實際上是我正在經歷的)。我有什麼問題嗎? – Aldin 2011-02-28 18:36:47

+0

@Aldin你怎麼確定一個連接佔用一個調用'io_service :: run()'的線程? – 2011-02-28 19:02:17

+0

我向連接:: handle_read()函數(服務器端)添加了一條日誌消息,該函數打印連接遠程端點的端口號,並且我只獲得前兩個連接(io_service線程池= 2)的讀取,而其他連接被阻塞(沒有日誌消息),直到前兩個連接之一完成,這可能需要一段時間,因爲正在傳輸大型文件。 – Aldin 2011-02-28 19:37:44