【网络】socket套接字结合IO多路复用

引言

在多线程编程中,I/O 多路复用(如 selectpollepoll)可以与多线程结合使用,以提高系统的并发处理能力和效率。结合多线程和 I/O 多路复用,可以实现高性能的网络服务器和客户端。以下是一些常见的多线程和 I/O 多路复用结合使用的策略和示例:

常见策略

  1. 单线程使用 I/O 多路复用:
    在一个单独的线程中使用 I/O 多路复用来监视所有的文件描述符。当有文件描述符变得就绪时,在该线程中处理 I/O 操作。这种方法简单且易于实现,但可能会因为单线程的处理能力受限,无法充分利用多核 CPU 的性能。

  2. 多线程使用 I/O 多路复用:
    在主线程中使用 I/O 多路复用来监视所有的文件描述符。当有文件描述符变得就绪时,调用或创建线程来处理 I/O 操作。这种多线程与 I/O 多路复用相结合的方式,可以提高服务器的并发处理能力,充分利用多核 CPU 的性能,是实现高性能网络服务器的一种有效方法。

示例代码

下面是一个简单的例子,展示了如何在多线程环境中结合使用 I/O 多路复用和工作线程池来处理网络连接:

#include <iostream>
#include <vector>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <queue>
#include <sys/select.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <cstring>#define PORT 8080
#define MAX_CLIENTS 30std::mutex queue_mutex;
std::condition_variable condition;
std::queue<int> client_queue;void worker_thread() {while (true) {std::unique_lock<std::mutex> lock(queue_mutex);condition.wait(lock, []{ return !client_queue.empty(); });int client_socket = client_queue.front();client_queue.pop();lock.unlock();char buffer[1024] = {0};int valread = read(client_socket, buffer, 1024);if (valread > 0) {buffer[valread] = '\0';//可对字符串进行处理send(client_socket, buffer, valread, 0);}close(client_socket);}
}int main() {int server_fd, new_socket;struct sockaddr_in address;fd_set readfds;int client_sockets[MAX_CLIENTS] = {0};server_fd = socket(AF_INET, SOCK_STREAM, 0);address.sin_family = AF_INET;address.sin_addr.s_addr = INADDR_ANY;address.sin_port = htons(PORT);bind(server_fd, (struct sockaddr*)&address, sizeof(address));listen(server_fd, 3);// 创建工作线程池std::vector<std::thread> workers;for (int i = 0; i < 4; ++i) {workers.emplace_back(worker_thread);}while (true) {FD_ZERO(&readfds);FD_SET(server_fd, &readfds);int max_sd = server_fd;for (int i = 0; i < MAX_CLIENTS; i++) {int sd = client_sockets[i];if (sd > 0)FD_SET(sd, &readfds);if (sd > max_sd)max_sd = sd;}int activity = select(max_sd + 1, &readfds, NULL, NULL, NULL);if (FD_ISSET(server_fd, &readfds)) {new_socket = accept(server_fd, NULL, NULL);for (int i = 0; i < MAX_CLIENTS; i++) {if (client_sockets[i] == 0) {client_sockets[i] = new_socket;break;}}}for (int i = 0; i < MAX_CLIENTS; i++) {int sd = client_sockets[i];if (FD_ISSET(sd, &readfds)) {std::unique_lock<std::mutex> lock(queue_mutex);client_queue.push(sd);lock.unlock();condition.notify_one();client_sockets[i] = 0;}}}for (std::thread &worker : workers) {worker.join();}return 0;
}

代码解释

  • 主线程: 主线程负责使用 select 监视服务器套接字和已连接的客户端套接字。select 函数返回就绪的套接字后,主线程将新的客户端连接或已就绪的客户端套接字加入任务队列,并通知工作线程池处理这些套接字。

  • 工作线程池: 多个工作线程从任务队列中获取套接字,并处理 I/O 操作,如读取数据、发送响应和关闭连接。

  • 同步机制: 使用 std::mutexstd::condition_variable 实现线程间的同步,确保安全地访问和修改任务队列。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/15958.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue+css解决图片变形问题(flex-shrink: 0)

解决前 给图片添加 flex-shrink: 0;即可解决图片变形问题

基于springboot+vue的致远汽车租赁系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

东方通TongWeb结合Spring-Boot使用

一、概述 信创需要; 原状:原来的服务使用springboot框架,自带的web容器是tomcat,打成jar包启动; 需求:使用东方通tongweb来替换tomcat容器; 二、替换步骤 2.1 准备 获取到TongWeb7.0.E.6_P7嵌入版 这个文件,文件内容有相关对应的依赖包,可以根据需要来安装到本地…

上5个B端系统的设计规范,让你的开发比着葫芦画瓢。

B端系统设计规范在企业级系统开发中起着重要的作用&#xff0c;具体包括以下几个方面&#xff1a; 统一风格和布局&#xff1a;设计规范能够统一系统的风格和布局&#xff0c;使不同功能模块的界面看起来一致&#xff0c;提升用户的使用体验和学习成本。通过统一的设计规范&am…

Day42 最后一块石头的重量Ⅱ + 目标和 + 一和零

1049 最后一块石头的重量Ⅱ 题目链接&#xff1a;1049.最后一块石头的重量Ⅱ 有一堆石头&#xff0c;用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。 每一回合&#xff0c;从中选出任意两块石头&#xff0c;然后将它们一起粉碎。假设石头的重量分别为 x 和…

力扣 5. 最长回文子串 python AC

动态规划 class Solution:def longestPalindrome(self, s):size len(s)maxl 1start 0dp [[False] * size for _ in range(size)]for i in range(size):dp[i][i] Truefor L in range(2, size 1):for i in range(size):j L i - 1if j > size:breakif s[i] s[j]:if L…

AI大模型领域新闻跟踪

杨值麟 月之暗面杨植麟&#xff1a;大模型开发是“承包森林”月之暗面集结最强创投&#xff0c;“清华师姐”是最强“助攻”月之暗面杨植麟&#xff1a;互联网研发是“种树”&#xff0c;大模型研发是“承包森林”月之暗面杨植麟复盘大模型创业这一年&#xff1a;向延绵而未知…

Web课外练习9

<!DOCTYPE html> <html> <head><meta charset"utf-8"><title>邮购商品业务</title><!-- 引入vue.js --><script src"./js/vue.global.js" type"text/javascript"></script><link rel&…

B2117 整理药名

整理药名 题目描述 医生在书写药品名的时候经常不注意大小写&#xff0c;格式比较混乱。现要求你写一个程序将医生书写混乱的药品名整理成统一规范的格式&#xff0c;即药品名的第一个字符如果是字母要大写&#xff0c;其他字母小写。 如将 ASPIRIN 、 aspirin 整理成 Aspir…

python获取cookie的方式

通过js获取cookie&#xff0c;避免反复登录操作。 经验证在JD上没有用&#xff0c;cookie应该无痕或者加密了&#xff0c;只能用单浏览器不关的模式来实现&#xff0c;但是代码留着&#xff0c;其他网站可能有用。 def cookie_set():driver webdriver.Chrome(optionschrome_…

一千题,No.0024(数素数)

令 Pi​ 表示第 i 个素数。现任给两个正整数 M≤N≤104&#xff0c;请输出 PM​ 到 PN​ 的所有素数。 输入格式&#xff1a; 输入在一行中给出 M 和 N&#xff0c;其间以空格分隔。 输出格式&#xff1a; 输出从 PM​ 到 PN​ 的所有素数&#xff0c;每 10 个数字占 1 行&…

Kubernetes 文档 / 概念 / 工作负载 / 工作负载管理 / Job

Kubernetes 文档 / 概念 / 工作负载 / 工作负载管理 / Job 此文档从 Kubernetes 官网摘录 中文地址 英文地址 Job 会创建一个或者多个 Pod&#xff0c;并将继续重试 Pod 的执行&#xff0c;直到指定数量的 Pod 成功终止。 随着 Pod 成功结束&#xff0c;Job 跟踪记录成功完成的…

原哥花了1个多月的时间终于开发了一款基于android studio的原生商城app

大概讲一下这个app实现的功能和前后端技术架构。 功能简介 广告展示商品展示跳转淘宝联盟优惠卷购买发布朋友圈宝妈知识资讯商品搜索朋友圈展示/点赞/评论登陆注册版本升级我的个人资料商品和资讯收藏我的朋友圈意见反馈 安卓端技术选型 Arouter组件化daggerrxjavaretrofit…

基于开源二兄弟MediaPipe+Rerun实现人体姿势跟踪可视化

概述 本文中&#xff0c;我们将探索一个利用开源框架MediaPipe的功能以二维和三维方式跟踪人体姿势的使用情形。使这一探索更有趣味的是由开源可视化工具Rerun提供的可视化展示&#xff0c;该工具能够提供人类动作姿势的整体视图。 您将一步步跟随作者使用MediaPipe在2D和3D环…

【计算机毕业设计】基于SSM+Vue的校园美食交流系统【源码+lw+部署文档】

目录 前 言 第1章 概述 1.1 研究背景 1.2 研究目的 1.3 研究内容 第二章 开发技术介绍 2.1 Java技术 2.2 Mysql数据库 2.3 B/S结构 2.4 SSM框架 第三章 系统分析 3.1 可行性分析 3.1.1 技术可行性 3.1.2 经济可行性 3.1.3 操作可行性 3.2 系统性能分析 3.3 系…

大模型训练中CUDA out of memory的几种解决方法

常用&#xff1a; 1. 减小batch size 2. 如果需要较大的batch size来达到预期训练指标效果&#xff0c;则使用gradient accumulation来累积梯度&#xff0c;达到等价效果的同时&#xff0c;占用显存小&#xff1b; 3. 使用低精度做训练。&#xff08;mixed precision traini…

自麻省理工学院和谷歌最新研究:零样本跨语言对齐的新途径

在构建实用的语言模型&#xff08;LMs&#xff09;时&#xff0c;使模型与人类偏好对齐是一个不可或缺的阶段。这通常需要大量的标注偏好数据&#xff0c;这些数据对于多种语言来说难以获取&#xff0c;尤其是对于多语种环境&#xff0c;这使得扩展到更多语言变得具有挑战性。本…

YOLO系列模型疑问

YOLO模型V1版本 1、论文里提到bounding box的&#xff08;x&#xff0c;y&#xff09;值表示什么意思呢&#xff1f; 原论文&#xff1a; Each bounding box consists of 5 predictions: x, y, w, h, and confidence. The (x, y) coordinates represent the center of the bo…

Golang发送GET请求并设置查询参数

服务端 package mainimport ("encoding/json""net/http""zdpgo_chi""zdpgo_chi/middleware" )func main() {r : zdpgo_chi.NewRouter()r.Use(middleware.RequestID)r.Use(middleware.RealIP)r.Use(middleware.Logger)r.Use(middlewar…

看这两位东北圣女美吗?如何描写美女的大长腿?

看这两位东北圣女美吗&#xff1f;如何描写美女的大长腿&#xff1f; 最近署名为懂球娘娘的一篇描写东北圣女的文章火了&#xff0c;文中描述了海棠朵朵与辛芷蕾这两位娇媚动人的角色。其美艳动人的形象和魅力四溢的描写让人为之倾倒。 这种通过文字展现人物魅力的能力让人佩服…