C++ class thread pool implementation

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 *

	}
}

Result display:
Insert picture description here

Guess you like

Origin blog.csdn.net/z15005953031/article/details/114321892