執行緒池
執行緒池就是預先建立好執行緒等待任務到來,然後接受任務去執行。在一定程度上減少了臨時開闢執行緒的時間,提高程式執行效率。執行緒池一般需要乙個管理執行緒,任務佇列,空閒執行緒佇列,工作執行緒佇列。
管理執行緒:一般用於監視執行緒池的工作狀態,當任務過多時就會增加執行緒參加工作,當任務比較少的時候銷毀一些空閒執行緒減少資源銷毀。
任務佇列:用於存放任務;
空閒執行緒佇列:存放沒有任務執行的執行緒;
工作執行緒佇列:存放處於工作中的執行緒;
**如下:
標頭檔案:thread_pool.h
#include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;
const int checktime = 2;
const int pthreadgap= 10;
const int defaultnum= 4;
//任務節點
typedef class task
; task(string& taskname): strtaskname(taskname), ptrdata(nullptr){};
virtual ~task(){};
virtual int run() = 0;//純虛函式。
void setdata(void* data);
protected:
string strtaskname;
void* ptrdata;
}task;
class pthreadpool
; pthreadpool(int pthreadnum):pthreadnum(pthreadnum)
; ~pthreadpool(){};
void addtask(task *task);//新增任務節點
int stopall();//關閉所有執行緒
int pthreadidlesize();//空閒執行緒的大小
int pthreadbusysize();//工作執行緒的大小
int gettasksize();//任務佇列大小
};
實現**:thread_pool.cpp#include"thread_pool.h"
void task::setdata(void* data)
//靜態成員的初始化
vectorpthreadpool::tasklist;
vectorpthreadpool::pthreadidle;
vectorpthreadpool::pthreadbusy;
bool pthreadpool::shutdown=false;//初始化執行緒池的關閉狀態
pthread_mutex_t pthreadpool::pthreadmutex = pthread_mutex_initializer;
pthread_cond_t pthreadpool::pthreadcond = pthread_cond_initializer;
void* pthreadpool::pthreadfun(void *arg)
if(shutdown)//如果執行緒池關閉則退出執行緒
task *task=*iter;
tasklist->erase(iter);
pthread_mutex_unlock(&pthreadmutex);
printf(" pthread: %lu is runing-> ",tid);
task->run();
movetoidle(tid);//移動到空閒執行緒當中去
} return null;
}void pthreadpool::createpool()
//pthread_create(&this->admintid,null,pthreadadmin,this);//建立admin執行緒
return ;
}void pthreadpool::addtask(task *task)
void pthreadpool::movetobusy(pthread_t tid)
++iter;
} pthreadidle.erase(iter);
pthreadbusy.push_back(tid);
return ;
}void pthreadpool::movetoidle(pthread_t tid)
++iter;
} pthreadbusy.erase(iter);
pthreadidle.push_back(tid);
return ;
}int pthreadpool::pthreadidlesize()
int pthreadpool::pthreadbusysize()
int pthreadpool::gettasksize()
int pthreadpool::stopall()
for(iter=pthreadbusy.begin();iter!=pthreadbusy.end();++iter)
pthread_mutex_destroy(&pthreadmutex);
pthread_cond_destroy(&pthreadcond);
return 0;
} void* pthreadpool::pthreadadmin(void* arg)
; int run()
};int main(int argc,char*ar**)
while(1)
}sleep(10);
printf("3 seconds later...\n");
} return 0;
}
makefile:
src=$(wildcard *.cpp)
obj=$(patsubst %.cpp ,%.o,$)
targets = $(patsubst %.cpp, %,$(src))
all=main
$:$ g++ -g -o $@ $^ -pthread
.phony:
clean:
rm -rf *.o $
C 簡單執行緒池實現
執行緒池,簡單來說就是有一堆已經建立好的執行緒 最大數目一定 初始時他們都處於空閒狀態,當有新的任務進來,從執行緒池中取出乙個空閒的執行緒處理任務,然後當任務處理完成之後,該執行緒被重新放回到執行緒池中,供其他的任務使用,當執行緒池中的執行緒都在處理任務時,就沒有空閒執行緒供使用,此時,若有新的任務...
c 簡單執行緒池實現
boost threadpool參考 執行緒池,簡單來說就是有一堆已經建立好的執行緒 最大數目一定 初始時他們都處於空閒狀態,當有新的任務進來,從執行緒池中取出乙個空閒的執行緒處理任務,然後當任務處理完成之後,該執行緒被重新放回到執行緒池中,供其他的任務使用,當執行緒池中的執行緒都在處理任務時,就沒...
c 簡單執行緒池實現
執行緒池,簡單來說就是有一堆已經建立好的執行緒 最大數目一定 初始時他們都處於空閒狀態,當有新的任務進來,從執行緒池中取出乙個空閒的執行緒處理任務,然後當任務處理完成之後,該執行緒被重新放回到執行緒池中,供其他的任務使用,當執行緒池中的執行緒都在處理任務時,就沒有空閒執行緒供使用,此時,若有新的任務...