[英]Handling multiple clients simultaneously in C++ UDP server
我開發了一個基於 C++ UDP 的服務器應用程序,我正在實現代碼以同時處理多個客戶端。 關於如何處理多個客戶並希望填補知識空白,我有以下理解
我的逐步理解如下所述
步驟 3 到 7 負責同時處理多個客戶端。 我的理解夠嗎? 我哪里需要改進? 提前致謝
客戶端得到響應並且工作線程終止。
工作線程應在完成處理后終止。 它沒有實用的方法來等待客戶端的確認。
工作線程處理請求並將響應發送給客戶端 IP:port
我認為將響應放在隊列中會更好。 主服務器線程可以檢查隊列並發送在那里找到的任何響應。 當兩個工作線程在嘗試發送響應時重疊時,這可以防止出現競爭情況。
服務器有一個消息隊列。它可以是數組或鏈表或隊列或任何相關的東西
它幾乎必須是一個隊列。 有趣的問題是什么隊列優先級。 最初 FIFO 會做。 如果您的服務器超載,那么您需要考慮替代方案。 也許最好估計所需的處理時間,然后先做快的。 或者也許不同的客戶應該有不同的優先級。
將其放入消息隊列后,將生成一個新線程(我們稱之為工作線程)
這最初很好。 但是,您將需要進行一些時間分析並確定線程池是否有優勢。
深入討論線程問題
作業處理必須在單獨的工作線程中完成,以便長時間作業不會阻止服務器接受來自其他客戶端的連接。 但是,您應該仔細考慮是否要使用多個工作線程。 由於您將作業請求放在隊列中,因此可以使用單個工作線程一個一個地處理它們。
PRO 單線程
更簡單、更可靠的代碼。 處理代碼必須是線程安全的,以便上下文切換回主線程。 但是,作業處理代碼之間不會有任何上下文切換。 這使得設計和調試處理代碼變得更加容易。 例如,如果作業正在更新數據庫,那么您不需要任何額外的代碼來確保數據庫始終保持一致 - 只需在每個作業流程結束時保證一致性。
對短期工作的響應更快。 如果同時提交了許多短作業,那么您的 CPU 可能會花費更多的周期在作業之間進行切換,而不是實際執行有用的處理。
CON單線程
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.