本线程池只写架构,任务可自行添加
【C++线程池简单示例】抽象类接口
#ifndef BASEELEMENT_H_INCLUDED
#define BASEELEMENT_H_INCLUDED
class BaseElement{
public:
BaseElement();
~BaseElement();
virtual void Task() = 0 ;
private:
};
#include "BaseElement.h"
BaseElement :: BaseElement() {}
BaseElement :: ~BaseElement(){}
任务接口
#ifndef CHILDELEMENT_H_INCLUDED
#define CHILDELEMENT_H_INCLUDED
#include "BaseElement.h"
class ChildElement : public BaseElement{
public:
ChildElement();
~ChildElement();
void Task();
private:
};
#endif // CHILDELEMENT_H_INCLUDED
#include "ChildElement.h"
#include
ChildElement :: ChildElement() {}
ChildElement :: ~ChildElement() {}
void ChildElement ::Task(){/* task function */ std :: cout<< "TaskRunning...."<:: endl;
}
#ifndef THREADPOOL_H_INCLUDED
#define THREADPOOL_H_INCLUDED
#include
#include
#include
#include
#include "BaseElement.h"
using namespace std ;
//class BaseElement ;
class ThreadPool{
public :
ThreadPool( intthreadMaxNumber = 5);
~ThreadPool();
bool InsertTask( BaseElement * be);
bool UnloadThreadPool();
int GetBusyThreadNumber() const ;
private:
static void ThreadFunction( ThreadPool * tp);
private:
list taskList;
list busyList;
thread *pThreadPool;
mutex waitThreadMutex ;
mutex popTaskMutex ;
mutex overTaskMutex ;
condition_variablewaitSignal;
int threadMaxValue;
bool isThreadMaxValue;
bool isShutdown;
};
#endif // THREADPOOL_H_INCLUDED
#include"ThreadPool.h"
#include
ThreadPool :: ThreadPool( int threadMaxNumber){
threadMaxValue = https://www.it610.com/article/threadMaxNumber;
isShutdown = false ;
if( threadMaxValue < 1 ){
isThreadMaxValue = false ;
}
else{
isThreadMaxValue = true ;
pThreadPool = new thread[threadMaxNumber];
for (int i = 0;
i < threadMaxNumber;
i++) {
pThreadPool[i] = thread(ThreadFunction, this);
}
}
}
ThreadPool :: ~ThreadPool(){
UnloadThreadPool();
}
void ThreadPool :: ThreadFunction( ThreadPool * tp){
while(tp->isThreadMaxValue){
while( tp->taskList.size() == 0 && !tp->isShutdown){
unique_lock lock(tp->waitThreadMutex);
tp->waitSignal.wait(lock);
}
if(tp->isShutdown){
break ;
}
tp->popTaskMutex.lock();
BaseElement * pbe = tp->taskList.front();
tp->taskList.pop_front();
tp->popTaskMutex.unlock();
pbe->Task();
cout << "ThreadID: " << this_thread::get_id() << endl;
while (!tp->isShutdown);
break;
tp->overTaskMutex.lock();
tp->busyList.pop_front();
/* dispose over thread event*/
delete pbe;
tp->overTaskMutex.unlock();
}
}
int ThreadPool:: GetBusyThreadNumber() const {
return busyList.size();
}
bool ThreadPool :: InsertTask(BaseElement * be){
unique_lock lock(waitThreadMutex);
if(GetBusyThreadNumber() >= threadMaxValue || !isThreadMaxValue){
return false ;
}
taskList.push_back(be);
busyList.push_back(be);
waitSignal.notify_one();
return true ;
}
bool ThreadPool ::UnloadThreadPool(){
if(!isThreadMaxValue || isShutdown){
return false ;
}
waitSignal.notify_all();
isShutdown = true ;
for (int i = 0;
i < threadMaxValue;
i++) {
pThreadPool[i].join();
//delete[]static_cast(&pThreadPool[i]);
}
if(GetBusyThreadNumber() > 0){
BaseElement* pbe;
for (auto it = busyList.begin();
it != busyList.end();
++it) {
pbe = *it;
cout << "ElementAddress: " << pbe << endl;
delete pbe;
}
busyList.clear();
taskList.clear();
pbe = nullptr;
}
delete[]pThreadPool;
return true ;
}
#include
#include "ThreadPool.h"
//#include "BaseElement.h"
#include "ChildElement.h"
int main(){
ThreadPool * tp = new ThreadPool(30);
tp->InsertTask(new ChildElement());
this_thread::sleep_for(chrono::milliseconds(1000));
tp->InsertTask(new ChildElement());
this_thread::sleep_for(chrono::milliseconds(1000));
tp->InsertTask(new ChildElement());
this_thread::sleep_for(chrono::milliseconds(1000));
tp->InsertTask(new ChildElement());
this_thread::sleep_for(chrono::milliseconds(1000));
tp->InsertTask(new ChildElement());
this_thread::sleep_for(chrono::milliseconds(1000));
tp->InsertTask(new ChildElement());
this_thread::sleep_for(chrono::milliseconds(1000));
tp->InsertTask(new ChildElement());
this_thread::sleep_for(chrono::milliseconds(1000));
tp->InsertTask(new ChildElement());
this_thread::sleep_for(chrono::milliseconds(1000));
tp->InsertTask(new ChildElement());
this_thread::sleep_for(chrono::milliseconds(1000));
tp->InsertTask(new ChildElement());
this_thread::sleep_for(chrono::milliseconds(1000));
delete tp;
//cin.get();
return 0 ;
}
测试结果
文章图片
推荐阅读
- Android基础|Android AsyncTask 源码详细解析,掌握工作原理和细节
- Android进阶|手撸一个简单的网络框架
- java|线程的几种状态
- 线程池|Java常用线程池以及参数解析
- Java|Java线程池介绍与基本案例
- Java|Java 多线程设计模式概述