一种用于管理和复用一组工作线程的设计模式,通过创建一个固定数量的线程,并将可并行执行的任务提交到线程中执行,从而避免为每个并行任务单独创建和销毁线程的开销。
https://github.com/mbrossard/threadpool
https://github.com/Pithikos/C-Thread-Pool
Thread VS ThreadPool
ThreadPool是预先分配的thread。如果每一个多线程任务都启动thread,则会导致过多的调度开销,以及线程创建/销毁的消耗。通过ThreadPool管理一定数量(线程数一般取 cpu 数量+2 比较合适)的thread,接收用户提交的任务,并由管理的thread执行。
优点
使得线程可以复用,执行完一个任务并不被销毁,而是可以继续执行其他的任务。在任务处理时间比较短的时候这个好处非常显著,可以提升任务处理的效率。
缺点
无法主动取消任务,无法获取任务完成状态。
需要考虑任务提交过多情况下有可能被延后执行的情况。
核心组件
任务队列
存储需要处理的任务,由工作的线程来处理这些任务。
// 任务结构体
typedef struct Task
{
void (*function)(void* arg);
void* arg;
}Task;