c++线程池实现方法
本文实例讲述了c++线程池实现方法。分享给大家供大家参考。具体分析如下:
下面这个线程池是我在工作中用到过的,原理还是建立一个任务队列,让多个线程互斥的在队列中取出任务,然后执行,显然,队列是要加锁的
环境:ubuntulinux
文件名:locker.h
#ifndefLOCKER_H_ #defineLOCKER_H_ #include"pthread.h" classlocker { public: locker(); virtual~locker(); boollock(); voidunlock(); private: pthread_mutex_tm_mutex; }; #endif/*LOCKER_H_*/
文件名:locker.cpp
#include"locker.h" locker::locker() { pthread_mutex_init(&m_mutex,0); } locker::~locker() { pthread_mutex_destroy(&m_mutex); } boollocker::lock() { if(0==pthread_mutex_lock(&m_mutex)) returntrue; returnfalse; } voidlocker::unlock() { pthread_mutex_unlock(&m_mutex); }
文件名:task_list.h
#ifndefTASK_LIST_H_ #defineTASK_LIST_H_ #include"list" #include"locker.h" #include"netinet/in.h" #include"semaphore.h" usingnamespacestd; typedefvoid*(*THREAD_FUNC)(void*); //线程池中运行的任务,对于下行任务,sin中包含目的地址信息 //parm0指向发出数据的对象,parm1指向数据,parm2为数据的长度 typedefstruct { THREAD_FUNCfunc; void*parm0; void*parm1; void*parm2; }task_info; typedeflist<task_info*>TASK_LIST; typedeflist<task_info*>::iteratorPTASK_LIST; classtask_list { public: task_list(); virtual~task_list(); voidappend_task(task_info*tsk); task_info*fetch_task(); private: TASK_LISTm_tasklist; lockerm_lk; sem_tm_sem; }; #endif/*TASK_LIST_H_*/
文件名:task_list.cpp
#include"task_list.h" task_list::task_list() { //InitSemaphore sem_init(&m_sem,0,0); m_tasklist.clear(); } task_list::~task_list() { while(!m_tasklist.empty()) { task_info*tr=m_tasklist.front(); m_tasklist.pop_front(); if(tr) deletetr; } //DestroySemaphore sem_destroy(&m_sem); } voidtask_list::append_task(task_info*tsk) { //LockbeforeModifythelist m_lk.lock(); m_tasklist.push_back(tsk); m_lk.unlock(); //IncreasetheSemaphore sem_post(&m_sem); } task_info*task_list::fetch_task() { task_info*tr=NULL; sem_wait(&m_sem); m_lk.lock(); tr=m_tasklist.front(); m_tasklist.pop_front(); m_lk.unlock(); returntr; }
文件名:thread_pool.h
#ifndefTHREAD_POOL_H_ #defineTHREAD_POOL_H_ #include"task_list.h" #include"pthread.h" #defineDEFAULT_THREAD_COUNT4 #defineMAXIMUM_THREAD_COUNT1000 classthread_pool { public: thread_pool(); virtual~thread_pool(); intcreate_threads(intn=DEFAULT_THREAD_COUNT); voiddelete_threads(); voidset_tasklist(task_list*plist); voiddel_tasklist(); protected: staticvoid*thread_func(void*parm); task_info*get_task(); private: intm_thread_cnt; pthread_tm_pids[MAXIMUM_THREAD_COUNT]; task_list*m_tasklist; }; #endif/*THREAD_POOL_H_*/
文件名:thread_pool.cpp
#include"thread_pool.h" thread_pool::thread_pool() { m_thread_cnt=0; m_tasklist=NULL; } thread_pool::~thread_pool() { delete_threads(); } task_info*thread_pool::get_task() { task_info*tr; if(m_tasklist) { tr=m_tasklist->fetch_task(); returntr; } returnNULL; } void*thread_pool::thread_func(void*parm) { thread_pool*ptp=static_cast<thread_pool*>(parm); task_info*task; while(true) { task=ptp->get_task(); if(task) { (*task->func)(task); //deletetask;//func负责释放task_info } } returnNULL; } intthread_pool::create_threads(intn) { if(n>MAXIMUM_THREAD_COUNT) n=MAXIMUM_THREAD_COUNT; delete_threads(); for(inti=0;i<n;i++) { intret=pthread_create(&m_pids[i],NULL,thread_func,(void*)this); if(ret!=0) break; m_thread_cnt++; } returnm_thread_cnt; } voidthread_pool::delete_threads() { for(inti=0;i<m_thread_cnt;i++) { void*retval; pthread_cancel(m_pids[i]); pthread_join(m_pids[i],&retval); } m_thread_cnt=0; } voidthread_pool::set_tasklist(task_list*plist) { m_tasklist=plist; } voidthread_pool::del_tasklist() { m_tasklist=NULL; }
文件名:test.cpp
#include"unistd.h" #include"stdio.h" #include"stdlib.h" #include"task_list.h" #include"thread_pool.h" void*fun(void*parm) { task_info*ptk=(task_info*)parm; pid_ttid=pthread_self(); intcount=(int)ptk->parm0; printf("count=%d,tid=%d\n",count,tid); returnNULL; } intmain() { intcount=0; thread_pooltp; task_listtl; tp.create_threads(4-1); tp.set_tasklist(&tl); while(1) { task_info*pti=NULL; pti=(task_info*)malloc(sizeof(task_info)); pti->func=fun; pti->parm0=(void*)count; tl.append_task(pti); count++; sleep(2); } //printf("hello,world\n"); return0; }
编译运行,我是用ecplise建立的automake工程,所以只要修改一下Makefile.am就可以编译成功了
文件名:Makefile.am
bin_PROGRAMS=test test_SOURCES=test.cpplocker.hlocker.cpp\ task_list.htask_list.cpp\ thread_pool.hthread_pool.cpp test_LDADD=-lpthread
执行结果:
count=0,tid=-1219888272 count=1,tid=-1219888272 count=2,tid=-1228280976 count=3,tid=-1236673680 count=4,tid=-1219888272 count=5,tid=-1228280976 count=6,tid=-1236673680 count=7,tid=-1219888272 count=8,tid=-1228280976 count=9,tid=-1236673680
希望本文所述对大家的C++程序设计有所帮助。