Liunx下C 簡單執行緒池實現

2021-09-11 04:20:58 字數 3201 閱讀 7834

執行緒池

執行緒池就是預先建立好執行緒等待任務到來,然後接受任務去執行。在一定程度上減少了臨時開闢執行緒的時間,提高程式執行效率。執行緒池一般需要乙個管理執行緒,任務佇列,空閒執行緒佇列,工作執行緒佇列。

管理執行緒:一般用於監視執行緒池的工作狀態,當任務過多時就會增加執行緒參加工作,當任務比較少的時候銷毀一些空閒執行緒減少資源銷毀。

任務佇列:用於存放任務;

空閒執行緒佇列:存放沒有任務執行的執行緒;

工作執行緒佇列:存放處於工作中的執行緒;

**如下:

標頭檔案: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 簡單執行緒池實現

執行緒池,簡單來說就是有一堆已經建立好的執行緒 最大數目一定 初始時他們都處於空閒狀態,當有新的任務進來,從執行緒池中取出乙個空閒的執行緒處理任務,然後當任務處理完成之後,該執行緒被重新放回到執行緒池中,供其他的任務使用,當執行緒池中的執行緒都在處理任務時,就沒有空閒執行緒供使用,此時,若有新的任務...