【c++】手撕单例模式线程池
文章目录
- C++线程池实现
- 项目概述
- 核心特性
- 1. 单例模式设计
- 2. 禁止拷贝与赋值
- 3. 固定线程池大小
- 4. 高效的任务队列
- 技术亮点
- 移动语义优化
- 条件变量的正确使用
- 优雅的退出机制
- 万能引用与完美转发
- 使用示例
- 技术栈
C++线程池实现
源码地址:https://github.com/1024freedom/thread_learn/tree/master
项目概述
这是一个轻量级的C++线程池实现,用于学习和理解多线程编程的核心概念。项目通过单例模式实现了一个可复用的线程池,支持任意类型任务的并发执行。
核心特性
1. 单例模式设计
线程池采用了单例模式,确保整个程序中只有一个线程池实例。通过静态局部变量实现了线程安全的懒汉式单例。 1
2. 禁止拷贝与赋值
为了防止误用,线程池显式禁用了拷贝构造函数和赋值运算符,这是管理资源类的最佳实践。 2
3. 固定线程池大小
默认创建10个工作线程,所有线程在构造时就已创建并开始等待任务。 3
4. 高效的任务队列
使用std::queue存储待执行任务,配合互斥锁和条件变量实现线程安全的生产者-消费者模式。 4
技术亮点
移动语义优化
在构造线程时使用了emplace_back而非push_back,直接在容器内存中构造对象,避免了额外的拷贝/移动操作。 5
任务出队时也使用了移动语义,提高了性能: 6
条件变量的正确使用
工作线程通过条件变量等待任务,避免了忙等待:
- 当任务队列为空且未停止时,线程进入等待状态
- 当有新任务入队或线程池停止时,线程被唤醒 7
优雅的退出机制
析构函数确保所有任务执行完毕后才退出:
- 设置停止标志
- 唤醒所有等待的线程
- 等待所有线程执行完毕 8
工作线程在检测到停止标志且任务队列为空时才会退出: 9
万能引用与完美转发
enqueue方法使用了模板和可变参数,支持任意类型的可调用对象和参数。通过std::forward实现完美转发,保持参数的值类别(左值/右值)。 10
使用示例
主函数展示了基本用法:向线程池提交10个任务,每个任务打印信息、休眠1秒后完成。 11
技术栈
- C++11标准特性
std::thread- 线程管理std::mutex- 互斥锁std::condition_variable- 条件变量std::function- 函数包装器- Lambda表达式
- 移动语义
- 可变参数模板
