代码示例:
基本框架:
#define pthnums 3
template
class threadpool
{public:threadpool(int nums=pthnums){pthread_num=nums;pthread_mutex_init(&mutex_,nullptr);pthread_cond_init(&cond_,nullptr);is_start=true;}~threadpool(){pthread_mutex_destroy(&mutex_);pthread_cond_destroy(&cond_);}static void* Routine(void* argv)//类内函数有this指针,将其设置为静态,argv接受this{pthread_detach(pthread_self());threadpool *tp = static_cast*>(argv);while(true){cout<<"pthread["<lockQueue();while(tp->isempty()){tp->waitTask();}T t=tp->pop();//拿到任务tp->unlockQueue();int one, two;t.get(&one, &two);cout<< "新线程 "< _q;pthread_mutex_t mutex_;//互斥锁pthread_cond_t cond_;//信号量int pthread_num;//创建线程数量bool is_start;}; pop,push与执行任务的接口:
void push(const T x){lockQueue();_q.push(x);unlockQueue();SignalTask();}T pop(){T x=_q.front();_q.pop();return x;}
将其改为单例模式:
ThreadPool(const ThreadPool &) = delete;void operator=(const ThreadPool&) = delete; 增加一静态成员变量,用来创建线程池,并初始为空。
static ThreadPool *instancetemplate
ThreadPool *ThreadPool::instance = nullptr; 提供一个访问单例对象的函数
static ThreadPool *getInstance(){if (nullptr == instance) //过滤重复的判断{if (nullptr == instance){instance = new ThreadPool();}}return instance;} 任务函数:完成两数相加
class Task
{
public:Task(int a = 10, int b = 9): a_(a), b_(b){}int run(){return a_ + b_;}void getTask(int *a, int *b){*a = a_;*b = b_;}private:int a_;int b_;
};
完整代码:
#include "Task.hpp"
#define pthnums 3
#include
#include
#include
#include
#include
using namespace std;template
class threadpool
{
public:threadpool(const threadpool &) = delete;void operator=(const threadpool &) = delete;static threadpool *getInstance(){if (nullptr == instance) //过滤重复的判断{if (nullptr == instance){instance = new threadpool;}}return instance;}threadpool(int nums = pthnums){pthread_num = nums;pthread_mutex_init(&mutex_, nullptr);pthread_cond_init(&cond_, nullptr);is_start = true;}~threadpool(){pthread_mutex_destroy(&mutex_);pthread_cond_destroy(&cond_);}static void *Routine(void *argv) //类内函数有this指针,将其设置为静态,argv接受this{pthread_detach(pthread_self());threadpool *tp = static_cast *>(argv);while (true){cout << "pthread[" << pthread_self() << "]running" << endl;tp->lockQueue();while (tp->isempty()){tp->waitTask();}T t = tp->pop(); //拿到任务tp->unlockQueue();int one, two;t.get(&one, &two);cout << "新线程 " << pthread_self() << " 完成计算任务: " << one << "+" << two << "=" << t.run() << "\n";}}void start() //创建pthread_num个线程{assert(is_start);for (int i = 0; i < pthread_num; i++){pthread_t tid;pthread_create(&tid, nullptr, Routine, this);}is_start = false;}void push(const T x){lockQueue();_q.push(x);unlockQueue();SignalTask();}T pop(){T x = _q.front();_q.pop();return x;}private://封装的接口void lockQueue(){pthread_mutex_lock(&mutex_);}void unlockQueue(){pthread_mutex_unlock(&mutex_);}void waitTask(){pthread_cond_wait(&cond_, &mutex_);}void SignalTask(){pthread_cond_signal(&cond_);}bool isempty(){return _q.empty();}private:queue _q;pthread_mutex_t mutex_; //互斥锁pthread_cond_t cond_; //信号量int pthread_num; //创建线程数量bool is_start;static threadpool *instance;
};template
threadpool *threadpool::instance = nullptr;
进行测试:
#include "threadpool.hpp"
#include int main()
{srand(time(nullptr));threadpool *p = threadpool::getInstance();int a;int b;p->start();while (true){a = rand() % 100;b = rand() % 50;Task t(a, b);p->push(t);//sleep(1);}return 0;
}
结果:
