说明
本线程池使用了互斥锁、条件变量、函数指针等常用工具。
线程池的创建与执行
threadpool_create创建线程池时,首先分配线程池数组和任务队列数组的空间,然后调用pthread_create创建线程,此时任务队列为空。 这样新创建的线程由于任务队列为空,所以都阻塞了。必须等待任务队列中有任务才能取执行。这部分实现使用条件变量。 当用threadpool_add添加很多任务后,每个线程在取新任务时直接从任务队列头部取出并执行。由于需要不断的执行任务,所以threadpool_thread采用一个死循环。
线程池的销毁
首先考虑到一个情况,就是在销毁的时候有可能任务队列已经为空,有若干线程阻塞在了条件变量上,首先将这些线程唤醒。 设置线程池的shutdown属性为真,这样每个线程在死循环中检测到shutdown为真后就退出死循环,然后用exit退出线程。 然后pthread_join等待所有线程退出,并且释放资源。 然后调用threadpool_free释放其他资源。
【代码】
//threadpool.h
#ifndef THREADPOOL_H
#define THREADPOOL_H
#include <pthread.h>
#include <deque>
using namespace std;
/*线程池第一版,将threadpool写成封装成类,用函数指针的方式实现函数多态,实现思路同threadpool
* */
typedef struct task{
void(*fun)(int);
int argument;
}task_t;
enum threadpool_error{
threadpool_invalidSize = -1,