[英]How to use non-blocking sockets with multiple threads?
我已經讀過,在線程中使用64個以上的套接字是危險的(?)。 但是-至少對我而言-非阻塞套接字用於避免復雜的線程。 由於只有一個偵聽器套接字,我應該如何將套接字拆分為線程並與select()一起使用? 我應該為每個線程創建fd_sets還是什么? 又因為我只能在CreateThread()的開頭傳遞值,我應該如何將客戶端分配給線程?
不不不,您在這里出錯了。
首先,處理許多套接字的理想方法是擁有一個線程池 ,該線程池將在套接字(客戶端)的前面進行工作。
另一個線程或兩個線程(實際上,據我所知實際上是CPU的數量)進行連接接受。
現在,當事件(例如新連接)發生時,該事件將被分派到線程池進行處理。
其次,這取決於實際的實現和環境。
例如,在Windows中,有一個叫做IOCP的東西。
如果您問我-不要打擾較低的實現,而要使用BOOST :: ASIO或ACE之類的框架。
我個人喜歡ASIO。 這些框架最好的地方是它們通常是跨平台的(nix,Windows等)。
因此,我的回答有點寬泛,但我認為最好是在深入研究代碼/手冊/實現之前將這些事實考慮在內。
祝好運!
正如Poni認為的那樣,“處理多個套接字的理想方法”並不總是“具有線程池”。
“理想”是什么意思? 編程容易嗎? 最棒的表演?
由於他建議不要為“較低級的實現”和“使用諸如BOOST :: ASIO或ACE之類的框架”而煩惱,我想他的意思是易於編程。
如果他在Windows上具有性能角度,他會推薦“稱為IOCP的東西”。 IOCP是“ IO控制端口”,將允許僅使用少數幾個線程(建議每個可用內核使用一個線程)來實現超快速IO應用程序。 IOCP應用程序圍繞任何線程池等效對象運行,如果他曾經使用它們編寫代碼,他會知道。 IOCP不在線程池旁邊使用,而是在線程池旁邊使用。
Linux中沒有等效的IOCP。
在Windows上使用框架可能會導致更快的“上市時間”產品,但是性能將與選擇純IOCP實現時的性能相去甚遠。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.