线程池
一、定义:线程池是一种线程使用模式。
二、目的:线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能够保证内核的充分利用线程池linux,还能防止过分调度。可用线程数量应该取决于可用的并发处理器、处理器内核、内存、网络sockets等的数量。
三、应用场景:
四、线程池示例:
功能:1. 创建固定数量线程池,循环从任务队列中获取任务对象,
2. 获取到任务对象后,执行任务对象中的任务接口
/* 线程池 */
#ifndef __M_POOL_H_
#define __M_POOL_H_
#include
#include
#include
#include
#include
#include
#include
#define MAX_THREAD 5
#define MAX_QUEUE 10
typedef bool (*HandleFunc)(int data);
class MyTask
{
private:
int _data;
HandleFunc _handleFunc;
public:
MyTask(){}
MyTask(int data,HandleFunc handleFunc)
:_data(data)
,_handleFunc(handleFunc) {}
~MyTask(){}
void SetTask(int data,HandleFunc handleFunc)
{
_data = data;
_handleFunc = handleFunc;
}
bool Run()
{
return _handleFunc(_data);
}
};
class MyThreadPool
{
private:
int max_thread; //线程池中最大线程数
int cur_thread; //当前线程池中的线程数
int quitFlag; //线程池中线程退出的标志
int max_queue; //队列的最大节点数
std::queue task_list; //任务队列
pthread_mutex_t mutex; //互斥量
pthread_cond_t empty; //条件变量
pthread_cond_t full; //条件变量
void ThreadLock() //加锁
{
pthread_mutex_lock(&mutex);
}
void ThreadUnLock() //解锁
{
pthread_mutex_unlock(&mutex);
}
void ConsumerWait() //消费者等待(为空则等待)
{
if(quitFlag == true) //所有任务均完成,则线程退出
{
cur_thread--;

pthread_mutex_unlock(&mutex);
printf("Thread[%p] exited.\n",pthread_self());
pthread_exit(NULL);
}
pthread_cond_wait(&empty,&mutex);
}
void ConsumerWake() //唤醒消费者
{
pthread_cond_signal(&empty);
}
void ConsumerWakeAll() //广播唤醒剩余所有线程
{
pthread_cond_broadcast(&empty);
}
void ProducterWait() //生产者等待(满了则等待)
{
pthread_cond_wait(&full,&mutex);
}
void ProducterWake() //唤醒生产者
{
pthread_cond_signal(&full);
}
bool QueueEmpty()
{
return task_list.empty();
}
bool QueueFull()
{
return (task_list.size() == max_queue ? true : false);
}
void QueuePush(MyTask& task) //将task放入任务队列
{
task_list.push(task);
}
void QueuePop(MyTask* task) //从任务队列取出task
{
*task = task_list.front();
task_list.pop();
}
public:
MyThreadPool(int maxt = MAX_THREAD,int maxq = MAX_QUEUE)
:max_thread(maxt)
,max_queue(maxq)
{
cur_thread = maxt;
quitFlag = false;
pthread_mutex_init(&mutex,NULL);
pthread_cond_init(&empty,NULL);
pthread_cond_init(&full,NULL);
}
~MyThreadPool()
{
pthread_mutex_destroy(&mutex);
pthread_cond_destroy(&empty);
pthread_cond_destroy(&full);
}
static void* ThreadFunc(void* arg) //线程执行函数
{
std::cout<<"In ThreadFunc()"<ThreadLock();
while(p->QueueEmpty()) //任务队列没任务
p->ConsumerWait();
MyTask task;
p->QueuePop(&task);
p->ProducterWake();
p->ThreadUnLock();
task.Run();
}
return NULL;
}
bool MyThreadPool_Init() //初始化线程池
{
pthread_t tid;
int ret;
for(int i = 0;i 0) //退出线程池内的所有线程
{
ConsumerWakeAll();
usleep(3000);
}
}
};
bool TaskHandle(int data)
{
srand((unsigned int)time(NULL));
int n = rand()%5;
printf("Thread[%p] is ready to sleep for %d seconds.\n",pthread_self(),n);
sleep(n);
return true;
}
int main()
{
MyThreadPool p;
p.MyThreadPool_Init();
MyTask task[10];
for(int i =0;i<10;++i)
{
task[i].SetTask(i,TaskHandle);
p.AddTask(task[i]);
printf("task[%d] : Add success!\n ",i);
}
p.MyThreadPool_Quit();
return 0;
}
#endif


(编辑:通辽站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|