2014-06-06 62 views
1

我正在研究用於學習puposes的多線程服務器應用程序。我現在的問題是接收數據。我第一次編寫應用程序時使用了WSAAsyncSelect,但我不喜歡它是如何工作的(即使隱藏了窗口,依賴窗口在我看來也是愚蠢的)。所以我重寫了它,現在我有一個線程通過連接的客戶端並檢查是否有任何數據要被接收並傳遞給工作線程。這對於一小部分客戶來說是有效的,但我認爲這可能會延誤其他客戶。我讀過的解決方案是爲每個客戶端設置一個線程,但是線程有限制。另一個解決方案是IOCP(Windows),但我需要找到一個很好的文檔,因爲我發現的例子有點太模糊(我可能是這裏的問題)非阻塞套接字多線程接收模型

我使用C/C++語言Microsoft Visual Studio 2013(WinSock,但我想寫在多平臺的方式)

+0

我認爲,[zeromq指南](http://zguide.zeromq.org/page:all)是您開始的正確地點。在處理套接字,線程和異步時,您將瞭解到注意事項。 –

+1

另一個好的來源是[Boost.Asio](http://www.boost.org/doc/libs/1_55_0/doc/html/boost_asio/overview.html)文檔 –

回答

0

如果一個線程足以處理所有的客戶端,考慮有N個線程和分配客戶端(例如通過哈希或按照接收)在可用線程中。

的關鍵是,線程總數(先在自己的過程:投票+工人......而且在整個系統)必須保持不變,不超過處理資源(CPU的/核心)

輪詢線程和工作線程之間的區別是正確的選擇。使用隊列結構解耦,釋放輪詢線程完成其工作(即輪詢)不受工作線程上運行的(任意)邏輯阻礙。

0

在Windows上,IOCP是可伸縮異步IO的標準模型。它解決了你提到的所有問題。 It has a sane programming model (with a few API design errors).I believe there are self-contained samples.要學習IOCP,我會使用這種技術創建一個非常簡單的聊天服務器,並儘量讓它完全正確。

該選擇的缺點是它不能縮放(如你所說)。

如果您需要可移植性,請查看異步IO庫,如Boost asio。他們在所有現代平臺上使用類似IOCP的模型。它們是回調驅動的。