讲师中心 微信公众号
AI工具推荐 视频效率加速

C++如何实现带限速的批量文件上传?(分片+令牌桶控制)

雨萱小哥_1135

雨萱小哥_1135

发布时间:2026-03-17 15:56:31

|

463人浏览过

|

来源于php中文网

原创

直接用sleep_for控速不靠谱,因它将网络等待时间计入限速窗口,导致吞吐波动;应改用独立运行的令牌桶,以单位时间发数据量为准,结合atomic操作、条件变量超时等待及读回调预检实现精准限速。

c++如何实现带限速的批量文件上传?(分片+令牌桶控制)

为什么直接用 std::this_thread::sleep_for 控制上传速率不靠谱

因为网络 I/O 本身是阻塞或异步的,单纯在每次发片后 sleep,会把「网络等待时间」也算进限速窗口,实际吞吐忽高忽低,尤其在高延迟或抖动网络下,限速完全失效。真正要控的是「单位时间内发出的数据量」,不是「发片间隔」。

  • 令牌桶必须独立于 I/O 调度运行,推荐用 std::thread + std::chrono::steady_clock 定期注入令牌
  • 每次准备发送分片前,先向桶申请对应字节数的令牌(比如一个 64KB 分片 → 申请 65536 个令牌)
  • 申请失败就等待,但要用 std::condition_variable::wait_until 配合超时,避免假死
  • 别用 std::mutex 全局锁桶,改用 std::atomic 管理剩余令牌数 + CAS 操作,减少争用

libcurl 多句柄上传中如何安全嵌入令牌桶逻辑

libcurl 的 CURLM 多句柄模式本身不提供速率钩子,不能靠 CURLOPT_XFERINFOFUNCTION 反推限速——那个回调只报告已传量,无法干预发送节奏。

  • 必须在 curl_easy_setopt(h, CURLOPT_READFUNCTION, ...) 的自定义读回调里做令牌预检:每次被要求提供数据前,先扣令牌;扣不到就返回 CURLE_AGAIN,并设置 CURLOPT_TIMEOUT_MS 防止卡死
  • 注意 CURLOPT_UPLOAD 必须设为 1L,且 CURLOPT_INFILESIZE_LARGE 要准确填分片大小,否则 libcurl 可能提前结束上传
  • 多个分片共用一个令牌桶时,桶对象需声明为 static 或全局,但访问必须线程安全(见上条 atomic 建议)

分片上传失败后,令牌要不要退还?

要退,而且必须在收到明确失败响应(如 HTTP 503、连接断开、libcurl 返回非 CURLE_OK)后立刻退还,否则后续分片可能因令牌不足而饿死。

C++ Code Review Master
C++ Code Review Master

组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。

下载
  • 不要等整个批量任务结束再统一退,网络错误是局部的
  • 退还数量 = 该分片申请的字节数(不是已发字节数),因为限速依据是「计划发送量」
  • 如果失败发生在传输中途(比如发了 32KB 后断连),仍按整片大小退还——令牌桶不追踪已发进度,只管准入控制
  • 用 std::atomic_fetch_add_explicit 做无锁退还,避免和注入线程竞争

Windows 下 WSAEventSelect 和令牌桶怎么协同?

如果你用 Winsock 事件模型驱动上传(而非 libcurl),不能让事件循环被令牌桶阻塞。事件句柄就绪 ≠ 立即能发数据,还得看桶里有没有令牌。

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

  • 注册 socket 时,只监听 FD_WRITE,但每次 WSAEnumNetworkEvents 收到就绪通知后,先查令牌桶;没令牌就忽略本次就绪,继续等待下一次
  • 绝不能在 WSAWaitForMultipleEvents 中加入令牌桶的 waitable handle——Windows 没有「原子等待事件+条件变量」的原生组合 API
  • 更稳的做法:把令牌桶的「令牌可用」信号转成一个人工 WSAEVENT,用 WSASetEvent 触发,并在主事件循环里一并等待它和 socket 事件
令牌桶的 refill interval 和 capacity 设置不对,比代码写错还难排查——它们直接影响并发分片数和单连接利用率,但又不报错,只让上传看起来“慢得莫名其妙”。

热门AI工具

更多
Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

相关专题

更多
线程和进程的区别
线程和进程的区别

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

3778

2023.08.10

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

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

523

2025.12.01

windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

3099

2023.07.26

查看端口占用情况windows
查看端口占用情况windows

端口占用是指与端口关联的软件占用端口而使得其他应用程序无法使用这些端口,端口占用问题是计算机系统编程领域的一个常见问题,端口占用的根本原因可能是操作系统的一些错误,服务器也可能会出现端口占用问题。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2658

2023.07.27

windows照片无法显示
windows照片无法显示

当我们尝试打开一张图片时,可能会出现一个错误提示,提示说"Windows照片查看器无法显示此图片,因为计算机上的可用内存不足",本专题为大家提供windows照片无法显示相关的文章,帮助大家解决该问题。

1448

2023.08.01

windows查看端口被占用的情况
windows查看端口被占用的情况

windows查看端口被占用的情况的方法:1、使用Windows自带的资源监视器;2、使用命令提示符查看端口信息;3、使用任务管理器查看占用端口的进程。本专题为大家提供windows查看端口被占用的情况的相关的文章、下载、课程内容,供大家免费下载体验。

2439

2023.08.02

windows无法访问共享电脑
windows无法访问共享电脑

在现代社会中,共享电脑是办公室和家庭的重要组成部分。然而,有时我们可能会遇到Windows无法访问共享电脑的问题。这个问题可能会导致数据无法共享,影响工作和生活的正常进行。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

3230

2023.08.08

windows自动更新
windows自动更新

Windows操作系统的自动更新功能可以确保系统及时获取最新的补丁和安全更新,以提高系统的稳定性和安全性。然而,有时候我们可能希望暂时或永久地关闭Windows的自动更新功能。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1517

2023.08.10

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

80

2026.09.30

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Conan 2 Essentials 免费课程
Conan 2 Essentials 免费课程

共0课时 | 0人学习

CMake 与 Conan 集成实践
CMake 与 Conan 集成实践

共0课时 | 0人学习

Conan 2 高级依赖模型介绍
Conan 2 高级依赖模型介绍

共0课时 | 0人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn