C++ 多线程(7):线程池原理及实现

原理

        线程池的工作原理:提前创建一定数量的线程,当有任务需要执行的之后就从线程池中寻找

空闲的现线程来执行任务。

模型

        以干饭人为线程,面包为任务,通过一个容器来储存线程,通过一个队列来对任务进行缓冲

C++ 多线程(7):线程池原理及实现_第1张图片

 代码实现

//线程池
#include
#include
#include
#include
#include
#include
#include
#include	
using namespace std;

//任务函数
void printNumber()
{
	static int number = 1;
	std::cout << "Number: " << number++ << std::endl;
}

//线程池
class ThreadPool
{
private:
	//任务队列
	queue>tasks;
	//线程容器
	vectorthreads;

	//互斥锁
	std::mutex mtx;
	//条件变量
	std::condition_variable condition;
	//用于结束所有线程
	bool stop;
public:
	//构造函数
	ThreadPool(int threadCnt)
	{
		stop = false;
		//线程执行函数
		auto f = [this] {
			//函数包装器,用于包装任务函数
			function func ;
			while (1)
			{
				//定义独锁,此线程在争抢任务的时候不让其他线程争夺
				std::unique_lockulock(mtx);
				//争抢任务,只要有任务或者是收到了停止线程的指令stop就不再等待
				condition.wait(ulock, [&] {
					if (tasks.empty() == false)
					{
						//获取任务
						func =tasks.front();
						//任务已被获取,可以将头部任务弹出
						tasks.pop();
						//执行任务
						func();
						return true;
					}
					else if (stop == true)
					{
						return true;
					}
					else
					{
						return false;
					}

					});
				//收到了停止指令还不行,我还要把所有任务都执行完
				if (stop == true && tasks.empty() == true)
				{
					break;
				}
			}
			};
		//增加线程
		for (int i=0;ijoin();
		}
	}
	//将任务入队
	void entasks(std::function&func)
	{
		mtx.lock();
		tasks.push(func);
		mtx.unlock();
	}

};

int main(void)
{
	//创建线程池
	ThreadPool pool(3);
	//创建函数包装器
	functionfunc;
	//向线程发送任务
	for (int i = 0; i < 3; i++)
	{
		func = printNumber;
		pool.entasks(func);
	}

	return 0;
}

你可能感兴趣的:(C++多线程,c++)