一种用于管理和复用一组工作线程的设计模式,通过创建一个固定数量的线程,并将可并行执行的任务提交到线程中执行,从而避免为每个并行任务单独创建和销毁线程的开销。

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;

Q.E.D.