main
#include <stdio.h>
#include <pthread.h>
#include <string.h>
#include <unistd.h>
#include <stack>
#include "CTask.h"
#include "CThreadPool.h"
#include <iostream>
using namespace std;
int main()
{
CThreadPool* pool = new CThreadPool(3);
pool->start();
sleep(3);
for (int i=0;i<20;i++)
{
CTask* t = new CTask(i);
pool->add_task(t);
}
while (1)
{
sleep(1);
}
}
CTask.h
#pragma once
class CTask
{
public:
CTask();
CTask(int i);
~CTask();
void run();
private:
int num;
int count;
};
CTask.cpp
#include "CTask.h"
#include <iostream>
using namespace std;
CTask::CTask()
{
}
CTask::CTask(int i):num(i),count(i)
{
//this->num = i;
}
CTask::~CTask()
{
}
void CTask::run()
{
cout << "num="<<this->num << endl;
}
CThreadPool.h
#pragma once
#include <stdio.h>
#include <pthread.h>
#include <string.h>
#include <unistd.h>
#include <stack>
#include <queue>
#include <stack>
#include <vector>
#include "CTask.h"
#include <iostream>
using namespace std;
class CThreadPool
{
public:
CThreadPool(int num);
queue<CTask*> s_stack;//任务队列
void add_task(CTask *t);
friend void* start_routine(void* arg);
int getidel();
void setidel(int n);
void set_lock();
void set_unlock();
int thread_wait();//等待信号变量
int thread_signal();//发送给信号变量
void start();//启动函数 一开始创建三个线程
private:
//条件变量 互斥锁 任务队列
pthread_cond_t cond;
pthread_mutex_t mutex;
int idle;
int thread_count;
};
CThreadPool.cpp
#include "CThreadPool.h"
//线程函数
void* start_routine(void* arg)
{
CThreadPool* pool = (CThreadPool*)arg;
//每次创建线程就等待
while(1)
{
int n = pool->getidel();
n++;
pool->setidel(n);
pool->set_lock();
//判断任务队列是否为空
if (pool->s_stack.empty())
{
//当前无任务
cout << "wait for work...." << pthread_self() << endl;
pool->thread_wait();
cout << "wake up work...." << pthread_self() << endl;
}
//空闲线程-1
n = pool->getidel();
n--;
pool->setidel(n);
//取出任务
CTask* t = pool->s_stack.front();
pool->s_stack.pop();
//解锁
pool->set_unlock();
t->run();
}
return nullptr;
}
CThreadPool::CThreadPool(int num):thread_count(num)
{
//初始化条件变量和互斥量
pthread_cond_init(&this->cond,NULL);
pthread_mutex_init(&this->mutex,NULL);
this->idle = 0;
}
//往队列添加任务
void CThreadPool::add_task(CTask* t)
{
//枷锁
this->set_lock();
//我那个任务加任务
this->s_stack.push(t);
//通知等待的线程
this->thread_signal();
sleep(1);
this->set_unlock();
}
int CThreadPool::getidel()
{
return this->idle;
}
void CThreadPool::setidel(int n)
{
this->idle = n;
}
//上锁
void CThreadPool::set_lock()
{
pthread_mutex_lock(&this->mutex);
}
//解锁
void CThreadPool::set_unlock()
{
pthread_mutex_unlock(&this->mutex);
}
//等待条件变量
int CThreadPool::thread_wait()
{
return pthread_cond_wait(&this->cond,&this->mutex);
}
int CThreadPool::thread_signal()
{
return pthread_cond_signal(&this->cond);
}
//启动线程池
void CThreadPool::start()
{
//创建 thread_count 个线程
for (int i = 0; i < thread_count; i++)
{
pthread_t tid;
pthread_create(&tid, NULL, start_routine, this);//不能做成成员函数 他有个属性 他是属于这个类的 但是这个是void *
}
}
结果展示: