C++多线程3——线程池
一、线程池的好处
如果任务的数量一开始不确定,我们该如何开辟线程?如果来一个任务开辟一个线程,任务结束之后又销毁线程,那么整体的效率会很低,大多数时间都在产生和销毁线程,该如何摆脱这种困境?
线程池的概念孕育而生,我们可以一次产生4个线程,它们组成一个线程池,相当于食堂的打菜大妈;接着会有一波任务接连过来,这些线程便依次完成这些任务,如果暂时没有任务,它们也不销毁,继续等待,直到设定的一定之间后,才销毁线程池。
线程池能够大大提高任务执行的效率。
二、线程池实例
如果从头开始写线程池,会非常复杂,目前我也没这个水平。花了很大功夫才找到Github上一个开源的线程池代码,并且用实例跑通了这个线程池,效果还是不错的。
这个线程池需要两个文件thpool.c和thpool.h。还是求和的例子,我们用线程池来实现:线程池有四个线程,1亿个元素分成40个任务,依次加入线程池,然后将40个结果再求和。
// gcc example3.c thpool.c -lpthread -D THREAD_DEBUG
// 正式运行时不需要加 -D THREAD_DEBUG
#include
#include
#include
#include
#include
#include "thpool.h"
const int S = 100000000;
int* arr;
typedef struct{
int first;
int last;
int result;
}MY_ARGS;
void mysum(void *args){
int i;
int s=0;
MY_ARGS* my_args = (MY_ARGS*) args;
int first = my_args->first;
int last = my_args->last;
for(i=first;i result = s;
}
int main(){
int i;
arr = malloc(sizeof(int) * S);
//1.数据准备
for(i=0;i
注意这里的mysum函数与pthread中有些不同,void没有加*,也没有return。我们可以自己修改mysum函数来完成不同的任务。
更多实例在我gitee:thread_pool