为什么使用线程池?
频繁创建和销毁线程浪费CPU资源
线程是什么?
一堆线程放在一个池子里统一管理
1. 构成
类似于银行柜台的流程
1.1 任务队列 job_queue
作用: 存放待处理的任务
成员:
构成 | 接口 |
---|---|
处理函数 | void *(*)(void*) |
参数 | void *arg |
队列指针 | struct job_queue* pnext |
1.2 工作线程 worker
作用: 处理任务
1.3 线程池 thread_pool
作用: 管理多个线程并提供任务队列的接口
成员:
构成 | 接口 |
---|---|
初始化 | threadpool_init() |
销毁 | threadpool_destroy() |
添加任务 | threadpool_add_job() |
2. 流程
使用流程:
- 初始化线程池
- 向线程池添加任务
- 销毁线程池
线程池初始化:
- 初始化任务队列和工作线程组
- 将等候在条件变量(任务队列上有任务)上的一个线程唤醒并从该任务队列中取出第一个任务给该线程执行
- 等待任务队列中所有任务执行完毕
3. 实例
#include <iostream>
#include <thread>
#include <queue>
#include <mutex>
#include <condition_variable>
#include <vector>
#include <functional>
using namespace std;
// 创建线程池
class ThreadPool{
vector<thread> threads; // 放线程
queue<function<void()>> tasks; // 放任务