【c++】【线程池】固定式线程池(FixedThreadPool)
1属性
1.1 Task可调用对象
使用 function 包装器和using类型重命名 设置一个Task的可调用对象(可理解为函数指针) 这个Task也就是我们的任务
using Task = std::function<void(void)>;
- 定义了一个类型别名 Task,它是 std::function<void(void)> 的别名。这样做的好处是,代码中以后可以直接使用 Task 来表示 std::function<void(void)> 类型的对象,而不需要每次都写出 std::function<void(void)>。 无返回值 无函数参数
1.2 同步队列的引入 m_queue
之前设计的同步队列的类
SyncQueue<Task> m_queue
1.3 线程组 -->使用智能指针管理
线程组是执行任务的线程的集合,使用唯一性智能指针管理
list<unique_ptr<thread>>m_threadgroup
1.4 线程组运行与否的判断–>m_running
atomic_bool m_running;
1.5 运行一次的标志–>m_flag
once_flag m_flag;
2方法(主要)
2.1 线程的入口函数–>RunInThread()
判断线程组是否运行(m_running) 循环从任务队列中获得任务 并执行这个任务 使用task();
2.2 线程的启动函数–>Start(int numthreads)
首先传入需要创建的线程个数 numthreads
判断线程组是否运行(m_running)
循环创建线程并放入线程组 使用智能指针管理这个线程 并且调用线程的入口函数
m_threadgroup.push_back(make_unique<thread>(&FixedThreadPool::RunInThread, this));
2.3 线程停止函数–>StopThreadGroup()
1 停止同步队列(强行停止 或者等待停止)
2 将 线程组运行与否置为否
3 遍历线程组 并判断当前线程是否存活 等待线程结束
4 释放线程资源
3方法(次要)
3.1向同步队列添加任务
调用m_queue里面的Put()添加函数 一个左值添加 一个右值添加
3.2 停止函数 stop()
判断线程停止函数–>StopThreadGroup() 只调用一次
3.3 构造函数
对m_queue 以及 numthreads进行初始化
并将m_running置为true 运行
内部调用Start() 现成的启动函数
3.4 析构函数
内部调用stop()
这里只是最基础的实现 还存在一些问题 比如上次提到的 以及无法获取函数执行返回值 以及一旦阻塞会一直等待 没有别的处理方案 后续会写一些完善措施