-
Notifications
You must be signed in to change notification settings - Fork 1
Utils_ThreadPauser
SweerItTer edited this page Feb 21, 2026
·
4 revisions
ThreadPauser 是 utilsCore Utils 模块的核心类,提供 Linux 平台特供的线程暂停和恢复功能,基于 eventfd 实现。
- 控制线程暂停和恢复
- 真正的内核级阻塞,暂停时不消耗 CPU
- 零锁设计,无锁竞争
- 支持超时唤醒
- 动态调整线程运行
- 资源受限时暂停线程
- 批量处理控制
- 线程调度
- 依赖: Linux eventfd 系统调用
- 被依赖: 异步任务处理等模块
- 仅支持 Linux 平台
- 如果需要跨平台支持,请使用条件变量版本
ThreadPauser 是线程暂停的封装类,提供:
- 基于 eventfd 的高性能暂停/恢复
- 零锁设计
- 支持暂停状态检查
- 支持超时唤醒
- PImpl 惯用法: 隐藏实现细节
- RAII: 自动管理资源
ThreadPauser();
~ThreadPauser();
// 移动构造函数
ThreadPauser(ThreadPauser&& other) noexcept;
// 移动赋值运算符
ThreadPauser& operator=(ThreadPauser&& other) noexcept;
// 禁用拷贝构造和拷贝赋值
ThreadPauser(const ThreadPauser&) = delete;
ThreadPauser& operator=(const ThreadPauser&) = delete;参数说明:
-
other: 要移动的源对象(移动操作后源对象处于有效但未定义状态)
返回值:
- 移动构造函数:无
- 移动赋值运算符:返回
*this的引用
所有权归属:
- ThreadPauser 拥有内部资源的所有权
- 移动操作后,资源所有权从源对象转移到目标对象
异常:
- 默认构造函数会在 eventfd 创建失败时抛出
std::system_error - 移动构造函数和移动赋值运算符为
noexcept,保证不抛出异常
注意事项:
- 构造时创建 eventfd
- 初始状态为未暂停
- 支持移动语义,禁止拷贝
- 移动操作后,源对象处于有效但未定义状态(通常为空状态)
- 移动构造函数和移动赋值运算符保证不抛出异常,适合在容器中使用
使用例程:
// 默认构造
ThreadPauser pauser;
// 移动构造
ThreadPauser pauser2 = std::move(pauser);
// 移动赋值
ThreadPauser pauser3;
pauser3 = std::move(pauser2);
// 在容器中使用
std::vector<ThreadPauser> pausers;
pausers.emplace_back(); // 使用移动语义void pause();参数说明: 无
返回值: 无
所有权归属:
- 无所有权转移
注意事项:
- 线程将在下一次调用 wait_if_paused() 时阻塞
- 线程安全操作
- 真正的内核级阻塞,不消耗 CPU
使用例程:
pauser.pause();void resume();参数说明: 无
返回值: 无
所有权归属:
- 无所有权转移
异常:
- 如果系统调用失败且未关闭,可能抛出
std::system_error
注意事项:
- 唤醒所有等待的线程
- 线程安全操作
- 通过 eventfd 实现唤醒
使用例程:
pauser.resume();void toggle();参数说明: 无
返回值: 无
所有权归属:
- 无所有权转移
注意事项:
- 暂停时恢复,未暂停时暂停
- 线程安全操作
使用例程:
pauser.toggle(); // 切换状态void wait_if_paused();参数说明: 无
返回值: 无
所有权归属:
- 无所有权转移
异常:
- 如果系统调用失败且未关闭,可能抛出
std::system_error
注意事项:
- 如果已暂停则阻塞,否则立即返回
- 真正的内核级阻塞
- 线程安全操作
使用例程:
// 在工作线程中
while (running) {
pauser.wait_if_paused(); // 如果已暂停则阻塞
// 处理任务...
do_work();
}bool wait_if_paused_for(int timeout_ms);参数说明:
-
timeout_ms(输入): 超时时间(毫秒)
返回值:
-
true: 等待成功(恢复或未暂停) -
false: 超时
所有权归属:
- 无所有权转移
注意事项:
- 支持超时唤醒
- 线程安全操作
使用例程:
// 在工作线程中
while (running) {
if (!pauser.wait_if_paused_for(1000)) {
printf("Still paused, doing other work\n");
}
// 处理任务...
do_work();
}bool is_paused() const;参数说明: 无
返回值:
-
true: 已暂停 -
false: 未暂停
所有权归属:
- 只读访问
注意事项:
- 线程安全操作
- 使用原子操作
使用例程:
if (pauser.is_paused()) {
printf("Thread is paused\n");
}void close();参数说明: 无
返回值: 无
所有权归属:
- 关闭后对象不可再使用
注意事项:
- 唤醒所有等待的线程
- 调用后对象不可再使用
- 线程安全操作
使用例程:
pauser.close(); // 关闭控制器bool is_closed() const;参数说明: 无
返回值:
-
true: 已关闭 -
false: 未关闭
所有权归属:
- 只读访问
注意事项:
- 线程安全操作
- 只读操作
使用例程:
if (pauser.is_closed()) {
printf("Controller is closed\n");
}ThreadPauser 使用 PImpl 惯用法隐藏实现细节:
class ThreadPauser {
private:
class Impl;
std::unique_ptr<Impl> impl_;
};基于 Linux eventfd 系统调用实现:
int eventfd(unsigned int initval, int flags);特点:
- 内核级阻塞
- 零锁设计
- 高性能
- 状态管理: 使用原子操作
- eventfd: 内核级同步
- 可以并发调用 pause()
- 可以并发调用 resume()
- 所有操作都是线程安全的
ThreadPauser pauser;
// 工作线程
std::thread worker([&]() {
while (running) {
pauser.wait_if_paused(); // 如果已暂停则阻塞
// 处理任务...
do_work();
}
});
// 暂停线程
pauser.pause();
// 恢复线程
pauser.resume();
worker.join();ThreadPauser pauser;
// 工作线程
std::thread worker([&]() {
while (running) {
if (!pauser.wait_if_paused_for(1000)) {
printf("Still paused, doing other work\n");
}
// 处理任务...
do_work();
}
});ThreadPauser pauser;
// 工作线程
std::thread worker([&]() {
while (running) {
pauser.wait_if_paused();
do_work();
}
});
// 切换暂停状态
pauser.toggle(); // 暂停
pauser.toggle(); // 恢复ThreadPauser pauser;
// 监控线程
std::thread monitor([&]() {
while (running) {
int memory_usage = get_memory_usage();
if (memory_usage > 90) {
printf("High memory usage, pausing worker\n");
pauser.pause();
} else if (memory_usage < 70 && pauser.is_paused()) {
printf("Memory usage normal, resuming worker\n");
pauser.resume();
}
sleep(1);
}
});
while(running) {
pauser.wait_if_paused();
// do something
}ThreadPauser pauser;
// 工作线程
std::thread worker([&]() {
while (running) {
pauser.wait_if_paused();
do_work();
}
});
// 关闭控制器,唤醒所有等待的线程
pauser.close();- 平台限制: 仅支持 Linux 平台
- eventfd: 依赖 Linux eventfd 系统调用
- 内核级阻塞: 真正的内核级阻塞,不消耗 CPU
- 零锁设计: 无锁竞争
- 关闭后不可用: close() 后对象不可再使用
- 线程安全: 所有操作都是线程安全的
- 异常处理: 注意处理可能抛出的异常
- PImpl: 使用 PImpl 惯用法隐藏实现细节
- ThreadUtils - 线程工具
- AsyncThreadPool - 异步线程池
- Utils 模块总览
主页
API 文档
DMA 模块
DRM 模块
- DRM 模块总览
- DeviceController - DRM 设备控制器
- DrmLayer - DRM 图层管理
- PlanesCompositor - DRM 平面合成器
- DrmBpp - DRM 格式定义
NET 模块
- NET 模块总览
- TcpServer - TCP 服务器
- SocketConnection - Socket 连接管理
- CommandHandler - 命令处理器
- DataPacket - 数据包
V4L2 模块
- V4L2 模块总览
- CameraController - V4L2 摄像头控制器
- Frame - V4L2 帧数据结构
- FormatTool - V4L2 格式工具
- Exception - V4L2 异常类
V4L2Param 模块
- V4L2Param 模块总览
- ParamControl - 参数控制
- ParamLogger - 参数日志
- ParamProcessor - 参数处理器
RGA 模块
- RGA 模块总览
- RgaConverter - RGA 转换器
- RgaProcessor - RGA 处理器
- FormatTool - RGA 格式工具
MPP 模块
- MPP 模块总览
- EncoderContext - 编码器上下文
- EncoderCore - 编码器核心
- JpegEncoder - JPEG 编码器
- StreamWriter - 流写入器
- MppResourceGuard - MPP 资源守护
- FileTools - 文件工具
- FormatTool - 格式工具
Sys 模块
- Sys 模块总览
- CpuMonitor - CPU 监控器
- MemoryMonitor - 内存监控器
- Base - 基础类
Mouse 模块
- Mouse 模块总览
- Watcher - 鼠标监视器
Utils 模块
- Utils 模块总览
- AsyncThreadPool - 异步线程池
- ConcurrentQueue - 并发队列
- FdWrapper - 文件描述符包装器
- FenceWatcher - 围栏监视器
- FixedSizePool - 固定大小对象池
- Logger - 日志记录器
- ObjectsPool - 对象池
- OrderedQueue - 有序队列
- ProgressBar - 进度条
- SafeQueue - 安全队列
- SharedBufferState - 共享缓冲区状态
- SimpleVariant - 简单变体类型
- ThreadPauser - 线程暂停器
- ThreadUtils - 线程工具
- Types - 类型定义
- UdevMonitor - Udev 监视器