簡體   English   中英

如何在多線程中使用非阻塞套接字?

[英]How to use non-blocking sockets with multiple threads?

我已經讀過,在線程中使用64個以上的套接字是危險的(?)。 但是-至少對我而言-非阻塞套接字用於避免復雜的線程。 由於只有一個偵聽器套接字,我應該如何將套接字拆分為線程並與select()一起使用? 我應該為每個線程創建fd_sets還是什么? 又因為我只能在CreateThread()的開頭傳遞值,我應該如何將客戶端分配給線程?

不不不,您在這里出錯了。

首先,處理許多套接字的理想方法是擁有一個線程池 ,該線程池將在套接字(客戶端)的前面進行工作。
另一個線程或兩個線程(實際上,據我所知實際上是CPU的數量)進行連接接受。

現在,當事件(例如新連接)發生時,該事件將被分派到線程池進行處理。

其次,這取決於實際的實現和環境。
例如,在Windows中,有一個叫做IOCP的東西。

如果您問我-不要打擾較低的實現,而要使用BOOST :: ASIOACE之類的框架。

我個人喜歡ASIO。 這些框架最好的地方是它們通常是跨平台的(nix,Windows等)。

因此,我的回答有點寬泛,但我認為最好是在深入研究代碼/手冊/實現之前將這些事實考慮在內。

祝好運!

好吧,你讀的是錯誤的。 許多強大的單線程應用程序都使用無阻塞套接字和高性能I / O多路分解器(如epoll(4)kqueue(2)編寫。 它們的優點是您可以預先設置等待事件,因此內核不必在每次輪詢時都復制大量的文件描述符,也不必重新設置很多東西。

然后,如果您的主要目標是吞吐量而不是延遲 ,則線程化將具有優勢。

請查看以下有關可用技術的概述: C10K問題

正如Poni認為的那樣,“處理多個套接字的理想方法”並不總是“具有線程池”。

“理想”是什么意思? 編程容易嗎? 最棒的表演?

由於他建議不要為“較低級的實現”和“使用諸如BOOST :: ASIO或ACE之類的框架”而煩惱,我想他的意思是易於編程。

如果他在Windows上具有性能角度,他會推薦“稱為IOCP的東西”。 IOCP是“ IO控制端口”,將允許僅使用少數幾個線程(建議每個可用內核使用一個線程)來實現超快速IO應用程序。 IOCP應用程序圍繞任何線程池等效對象運行,如果他曾經使用它們編寫代碼,他會知道。 IOCP不在線程池旁邊使用,而是在線程池旁邊使用。

Linux中沒有等效的IOCP。

在Windows上使用框架可能會導致更快的“上市時間”產品,但是性能將與選擇純IOCP實現時的性能相去甚遠。

性能差異使得應考慮特定於OS的代碼實現。 如果仍然選擇通用解決方案,那么至少“不會意外放棄性能”。

暫無
暫無

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

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