0

0

C++怎么处理高并发请求_C++服务器编程教程【性能】

裘德小鎮的故事

裘德小鎮的故事

发布时间:2026-03-10 12:02:02

|

161人浏览过

|

来源于php中文网

原创

直接裸用 std::thread 高并发易崩溃,因无连接复用和请求队列,每连接新建线程致 oom 或调度雪崩;须配合 epoll/iocp、非阻塞 socket、weak_ptr 生命周期管理及 steady_clock 超时。

c++怎么处理高并发请求_c++服务器编程教程【性能】

为什么 std::thread 直接裸用会崩得很快

因为 C++ 标准库不提供线程池、连接复用或请求队列,std::thread 每 accept 一个连接就 new 一个线程,QPS 上去后不是 OOM 就是调度雪崩。Linux 默认每个进程线程数上限常是 1024,pthread_create 失败时返回 EAGAIN,但很多新手没检查就直接 deref 空指针。

  • 别在 accept() 回调里无限制 new std::thread,哪怕加了 join() 也扛不住短连接洪峰
  • std::thread::hardware_concurrency() 当线程数上限参考,但实际要更保守(比如设为 CPU 核数 × 2)
  • 必须检查 std::thread 构造是否抛异常——std::system_error with std::errc::resource_unavailable_try_again 是真实信号,不是“偶尔出错”
  • 线程栈默认可能 8MB,std::thread 对象本身不占大内存,但栈空间会快速吃光 RLIMIT_STACK

epoll + 非阻塞 socket 是绕不开的起点

Windows 上用 IOCP,Linux 就得靠 epoll_wait() 配合非阻塞 socket,否则一个慢请求卡住整个线程。同步 read/write 在高并发下等于主动放弃吞吐量。

  • socket() 后立刻 fcntl(fd, F_SETFL, O_NONBLOCK),别等第一次 recv() 返回 EAGAIN 才想起来设
  • epoll_ctl() 加事件前确认 fd 已设为非阻塞,否则 epoll_wait() 可能永远不返回(尤其对 pipe 或 eventfd)
  • EPOLLET(边缘触发)比 EPOLLIN(水平触发)省系统调用,但要求每次 recv() 必须循环到 EAGAIN,否则会漏数据
  • 不要在 epoll_wait() 返回后对同一个 fd 多次 recv() 却不检查返回值——recv() 返回 0 表示对端 close,-1 且 errno == EAGAIN 才是正常

std::shared_ptr + weak_ptr 管理连接生命周期容易 double-free

异步模型里,连接对象可能被 I/O 回调、超时器、业务逻辑三处同时持有,shared_ptr 看似安全,但一旦某处忘了用 weak_ptr.lock() 就直接访问,或者析构顺序不对(比如 event loop 先于 connection 对象销毁),就会 crash。

Beautiful.ai
Beautiful.ai

AI在线创建幻灯片

下载
  • 所有跨线程持有的连接句柄,必须用 weak_ptr<connection></connection>,回调开头第一行就是 auto conn = wp.lock(); if (!conn) return;
  • 别在 Connection 析构函数里调用 epoll_ctl(EPOLLDEL)——此时 event loop 可能已停,fd 无效或被复用
  • shared_ptr 的控制块分配本身有锁开销,高频创建销毁连接时,考虑用对象池(如 boost::object_pool 或自定义 arena)预分配
  • 用 AddressSanitizer + ThreadSanitizer 编译,shared_ptr 生命周期问题在压测前就能暴露,比线上 core dump 好查得多

std::chrono::steady_clock 是唯一靠谱的超时依据

time()std::chrono::system_clock 做超时,NTP 调时、系统休眠、时钟跳跃都会导致连接提前断或死等。C++11 之后没有理由再碰 gettimeofday()

立即学习C++免费学习笔记(深入)”;

  • 所有定时器(空闲超时、读写超时、心跳间隔)都基于 std::chrono::steady_clock::now(),它不随系统时间调整而跳变
  • 别把 steady_clock::time_point 存成 long long 微秒再算差值——精度丢失,直接用 duration_cast<milliseconds>(tp - start)</milliseconds>
  • Linux 的 timerfd_create() 可以和 epoll 集成,但注意它的超时时间是相对当前内核时间,不是你代码里 steady_clock::now() 那一刻,两者存在微小偏差,关键业务需补偿
  • 测试时用 clock_settime(CLOCK_MONOTONIC, ...) 强制改系统单调时钟?不行——CLOCK_MONOTONIC 不可写,这是故意设计的

真正难的不是写完 epoll 循环,而是让每个连接的 socket、buffer、timer、业务状态在任意时刻被任意线程访问时,既不竞态也不泄漏。这些点没卡死,性能数字再好看也是假的。

相关文章

数码产品性能查询
数码产品性能查询

该软件包括了市面上所有手机CPU,手机跑分情况,电脑CPU,电脑产品信息等等,方便需要大家查阅数码产品最新情况,了解产品特性,能够进行对比选择最具性价比的商品。

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

846

2023.08.22

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

314

2025.08.29

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

105

2025.10.23

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

440

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

601

2023.08.10

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

764

2023.08.10

Java 并发编程高级实践
Java 并发编程高级实践

本专题深入讲解 Java 在高并发开发中的核心技术,涵盖线程模型、Thread 与 Runnable、Lock 与 synchronized、原子类、并发容器、线程池(Executor 框架)、阻塞队列、并发工具类(CountDownLatch、Semaphore)、以及高并发系统设计中的关键策略。通过实战案例帮助学习者全面掌握构建高性能并发应用的工程能力。

99

2025.12.01

空指针异常处理
空指针异常处理

本专题整合了空指针异常解决方法,阅读专题下面的文章了解更多详细内容。

23

2025.11.16

Kotlin Android模块化架构与组件化开发实践
Kotlin Android模块化架构与组件化开发实践

本专题围绕 Kotlin 在 Android 应用开发中的架构实践展开,重点讲解模块化设计与组件化开发的实现思路。内容包括项目模块拆分策略、公共组件封装、依赖管理优化、路由通信机制以及大型项目的工程化管理方法。通过真实项目案例分析,帮助开发者构建结构清晰、易扩展且维护成本低的 Android 应用架构体系,提升团队协作效率与项目迭代速度。

24

2026.03.09

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 11万人学习

C 教程
C 教程

共75课时 | 5.3万人学习

C++教程
C++教程

共115课时 | 21.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号