本文共 1894 字,大约阅读时间需要 6 分钟。
线程池是在处理高并发任务中有比较重要的价值,他的实现最基本原理就生产者和消费者模型,刚开始就开一定数量的线程,以程序中的某些功能模块为对象,以生产者与消费者模型为基本原理,不断使用这些固定数量的线程调度进行处理,避免了在高并发情况下,不断开辟线程造成的进程资源消耗.下面是一个简单的线程池程序,主要使用C++11中一些简单的新特性的最简单的线程池实现.
ThreadPool.h#pragma once#include#include #include #include #include #include #include #include #define N 10using namespace std;class ThreadPool{public: //自定义void()的函数类型 typedef function Task; ThreadPool(); ~ThreadPool(); public: size_t initnum; //线程数组 vector threads ; //任务队列 queue task ; //互斥锁条件变量 mutex _mutex ; condition_variable cond ; //线程池工作结束时为真 bool done ; //队列是否为空 bool isEmpty ; //队列是否为满 bool isFull;public: void addTask(const Task&f); void start(int num); void setSize(int num); void runTask(); void finish();};
ThreadPool.cpp
#include"ThreadPool.h"ThreadPool ::ThreadPool():done(false),isEmpty(true),isFull(false){}//设置池中初始线程数void ThreadPool::setSize(int num){ (*this).initnum = num ;}//添加任务void ThreadPool::addTask(const Task&f){ if(!done){ //保护共享资源 unique_locklk(_mutex); //要是任务数量到了最大,就等待处理完再添加 while(isFull){ cond.wait(lk); } //给队列中添加任务 task.push(f); if(task.size()==initnum) isFull = true; cout<<"Add a task"< lk(_mutex); //队列为空的话,就等待任务 while(isEmpty){ cond.wait(lk); } Task ta ; //转移控制快,将左值引用转换为右值引用 ta = move(task.front()); task.pop(); if(task.empty()){ isEmpty = true ; } isFull =false ; ta(); cond.notify_one(); }}void ThreadPool::start(int num){ setSize(num); for(int i=0;i
Test.cpp
#include#include"ThreadPool.h"void func(int i){ cout<<"task finish"<<"------>"< <
运行截图
原帖:
转载地址:http://kfemi.baihongyu.com/