個人主頁:Lei寶啊?
愿所有美好如期而遇
線程池
實現線程類
#pragma once#include <pthread.h>
#include <iostream>
#include <vector>
#include <string>
#include <cstdlib>
#include <cstring>
#include <functional>
#include <unistd.h>
#include "sem.hpp"
using namespace std;class Thread
{using func_t = function<void(string)>;public:void Excute(){_func(_threadname);}
public:Thread(func_t func, const std::string &name="none-name"): _func(func), _threadname(name), _stop(true){}static void *threadroutine(void *args) // 類成員函數,形參是有this指針的!!{Thread *self = static_cast<Thread *>(args);self->Excute();return nullptr;}bool Start(){int n = pthread_create(&_tid, nullptr, threadroutine, this);if(!n){_stop = false;return true;}else{return false;}}void Detach(){if(!_stop){pthread_detach(_tid);}}void Join(){if(!_stop){pthread_join(_tid, nullptr);}}std::string name(){return _threadname;}void Stop(){_stop = true;}~Thread() {}private:pthread_t _tid;std::string _threadname;func_t _func;bool _stop;
};
任務類
這個就隨便寫了,用來簡單測試。
#include <iostream>
using namespace std;class Task
{
public:void Compare(){cout << "compare" << endl;}void operator()(){Compare();}int a = 1;
int b = 2;};
線程池類
#include "Thread_pool.hpp"
#include <queue>const int g_pthreadnum = 6;pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;//線程池
template<class T>
class ThreadPool
{
public:ThreadPool(int num = g_pthreadnum):pthreadnum(num),state(false),waitnum(0){}void Everydo(string name){while(true){Lock();while(qtask.empty() && state){waitnum++;Wait_Pthread();waitnum--;}if(qtask.empty() && !state){UnLock();cout << name << ": quit" << endl;break;}T task = qtask.front();qtask.pop();task();UnLock();}}bool Push(const T& t){Lock();bool ret = false;if(state){qtask.push(t);if(waitnum > 0) WakeUp_sigle();ret = true;}UnLock();return ret;}void ThreadInit(){for(int i=0; i<pthreadnum; i++){string name = "pthread-" + to_string(i);vthread.emplace_back(bind(&ThreadPool::Everydo, this, placeholders::_1), name); //每個線程都要執行這個方法,這個方法會將任務隊列中的任務分配給他們}}void Wait(){for(auto &e : vthread) e.Join();}void Quit(){state = false;WakeUp_All();}void Start(){state = true;for(auto &e : vthread) e.Start();}private://線程池需要什么?線程數量,保存線程的容器int pthreadnum;vector<Thread> vthread;//一個任務隊列,創建線程池對象時,線程創建好,我們需要從外部接收任務分配給線程執行//我們希望能夠接收任意類型的任務,仿函數,函數,lambda表達式等,所以使用模板queue<T> qtask;//一個狀態,控制線程池的退出bool state;int waitnum;void Lock(){pthread_mutex_lock(&mutex);}void UnLock(){pthread_mutex_unlock(&mutex);}void WakeUp_sigle(){pthread_cond_signal(&cond);}void WakeUp_All(){pthread_cond_broadcast(&cond);}void Wait_Pthread(){pthread_cond_wait(&cond, &mutex);}
};
測試
?