簡體   English   中英

非阻塞套接字多線程接收模型

[英]Non-blocking sockets multi-threaded receive model

我正在研究用於學習目的的多線程服務器應用程序。 我現在的問題是接收數據。第一次編寫應用程序時,我使用WSAAsyncSelect,但我不喜歡它的工作方式(我認為即使依賴窗口也是如此,窗口依賴是愚蠢的)。 因此,我重新編寫了它,現在有了一個線程,該線程通過連接的客戶端,並檢查是否有任何要接收的數據並將其傳遞給工作線程。 這對少量客戶有效,但我認為對於較大數量的客戶而言,這可能會延遲太多其他客戶。 我讀過的一種解決方案是為每個客戶端都有一個線程,但是存在線程限制。 另一個解決方案是IOCP(Windows),但是我需要找到一個好的文檔,因為我發現的示例有些含糊(我可能是這里的問題)

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

如果一個線程足以處理所有客戶端,請考慮使用N個線程,並在可用線程之間分配客戶端(例如,通過哈希處理或按接收順序)。

關鍵是線程總數(進程中的第一個:polling + worker ...以及整個系統中的線程)必須保持恆定且不超過處理資源(CPU /核)的數量

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

在Windows上,IOCP是可伸縮異步IO的標准模型。 它解決了您提到的所有問題。 它具有健全的編程模型(帶有一些API設計錯誤)。 我相信有獨立的樣本。 要學習IOCP,我將使用此技術創建一個非常簡單的聊天服務器,並嘗試使其完全正確。

該選擇具有無法擴展的缺點(如您所說)。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM