C++11线程池的实现
什么是线程池
处理大量并发任务,一个请求一个线程来处理请求任务,大量的线程创建和销毁将过多的消耗系统资源,还增加了线程上下文切换开销。
线程池通过在系统中预先创建一定数量的线程,当任务请求到来时从线程池中分配一个预先创建的线程去处理任务,线程在处理任务之后还可以重用,不用销毁,从而节省系统资源。对于多核处理器,线程会被分配到多个CPU,提高并行处理效率。每个线程独立阻塞,防止主线程被阻塞而使主流程被阻塞
半同步半异步线程池
三层
第一层:同步服务层,处理上层任务请求
第二层:同步排队层,上层的任务请求放到同步排队层中等待处理(同步队列)
第三层:异步服务层,多个线程同时处理排队层中的任务,从同步排队层取出任务并处理

线程池有两个活动过程
一个是往同步队列中添加任务过程
一个是从同步队列中取任务过程

实现
《深入应用C++11》有完整的代码,但是用到的C11技术很多——锁,条件变量,move,不好记,大体讲一下思路
需要实现两个类,一个类用于实现同步队列(SyncQueue类),另一个类用于实现线程池(ThreadPool)
SyncQueue类
同步队列类完全可以用生产者消费者代替,书上代码用的条件变量实现的同步队列,这个类有个六个成员变量:
缓冲区用list:template<typename T> std::list<T> m_queue
互斥变量:std::mutex m_mutex
两个条件变量或者两个信号量,full和empty
同步队列最大size:int m_maxsize
停止标志:bool m_needstop
成员函数:
Take函数:取任务,P(full) mutex.lock mutex.unlock V(empty)
Add函数: P(empty) mutex.lock mutex.unlock V(full)
Stop函数
ThreadPool类
ThreadPool类有三个成员变量:
线程组:std::list<std::shared_ptr<std::thread>> m_threadgroup
同步队列: SyncQueue<Task> m_queue
停止线程池:bool m_running
成员函数:
Start:一个任务是创建线程放到线程组里,并取任务执行m_queue.Take
Stop:让同步队列中的线程停止,m_running = false 另外用thread.join来使每个调用中的线程结束
C++11线程池的实现的更多相关文章
- 托管C++线程锁实现    c++11线程池
		托管C++线程锁实现 最近由于工作需要,开始写托管C++,由于C++11中的mutex,和future等类,托管C++不让调用(报错),所以自己实现了托管C++的线程锁. 该类可确保当一个线程位于 ... 
- 简单的C++11线程池实现
		线程池的C++11简单实现,源代码来自Github上作者progschj,地址为:A simple C++11 Thread Pool implementation,具体博客可以参见Jakob's D ... 
- c++11 线程池学习笔记  (一)  任务队列
		学习内容来自一下地址 http://www.cnblogs.com/qicosmos/p/4772486.html github https://github.com/qicosmos/cosmos ... 
- c++11线程池实现
		咳咳.c++11 增加了线程库,从此告别了标准库不支持并发的历史. 然而 c++ 对于多线程的支持还是比較低级,略微高级一点的使用方法都须要自己去实现,譬如线程池.信号量等. 线程池(thread p ... 
- c++ 11 线程池---完全使用c++ 11新特性
		前言: 目前网上的c++线程池资源多是使用老版本或者使用系统接口实现,使用c++ 11新特性的不多,最近研究了一下,实现一个简单版本,可实现任意任意参数函数的调用以及获得返回值. 0 前置知识 首先介 ... 
- 基于C++11线程池
		1.包装线程对象 class task : public std::tr1::enable_shared_from_this<task> { public: task():exit_(fa ... 
- 《java.util.concurrent 包源码阅读》11 线程池系列之ThreadPoolExecutor 第一部分
		先来看ThreadPoolExecutor的execute方法,这个方法能体现出一个Task被加入到线程池之后都发生了什么: public void execute(Runnable command) ... 
- c++11线程池
		#pragma once #include <future> #include <vector> #include <atomic> #include <qu ... 
- c++11 线程池
		也可参考: https://www.cnblogs.com/ailumiyana/p/10016965.html *** https://blog.csdn.net/jlusuoya/article/ ... 
随机推荐
- Java泛型底层源码解析--ConcurrentHashMap(JDK1.7)
			1. Concurrent相关历史 JDK5中添加了新的concurrent包,相对同步容器而言,并发容器通过一些机制改进了并发性能.因为同步容器将所有对容器状态的访问都串行化了,这样保证了线程的安全 ... 
- [Vue warn]: Do not mount Vue to <html> or <body> - mount to normal elements instead.
			官方文档是这么解释的: 提供的元素只能作为挂载点.不同于 Vue 1.x,所有的挂载元素会被 Vue 生成的 DOM 替换.因此不推荐挂载root实例到 <html> 或者 <bod ... 
- 转:UINavigationBar返回上一级出现nested pop animation can result in corrupted navigation bar
			[self.navigationController popViewControllerAnimated:NO]; 出现上面的错误是因为pop的时候要确保先让本页面加载完成,即如果在viewDidLo ... 
- 洛谷 P3382 【模板】三分法
			https://www.luogu.org/problem/show?pid=3382 题目描述 如题,给出一个N次函数,保证在范围[l,r]内存在一点x,使得[l,x]上单调增,[x,r]上单调减. ... 
- presto架构和原理
			Presto 是 Facebook 推出的一个基于Java开发的大数据分布式 SQL 查询引擎,可对从数 G 到数 P 的大数据进行交互式的查询,查询的速度达到商业数据仓库的级别,据称该引擎的性能是 ... 
- Redis学习十一:Redis的Java客户端Jedis
			一.安装JDK tar -zxvf jdk-7u67-linux-i586.tar.gz vi /etc/profile 重启一次Centos 编码验证 二.安装eclipse 三.Jedis所需要的 ... 
- An Insight to References in C++
			[An Insight to References in C++] 引用的本质是常指针.占用的内存和指针一样. 参考:http://www.codeproject.com/Articles/13363 ... 
- 【Foreign】tty的方程math [数学]
			tty的方程math Time Limit: 50 Sec Memory Limit: 128 MB Description 给定n.m.k.p. a+b+c=n, a^2+b^2+c^2=m, a ... 
- 【AtCoder】ARC095 E - Symmetric Grid 模拟
			[题目]E - Symmetric Grid [题意]给定n*m的小写字母矩阵,求是否能通过若干行互换和列互换使得矩阵中心对称.n,m<=12. [算法]模拟 [题解]首先行列操作独立,如果已确 ... 
- transform动画效果
			transform动画效果 transform :移动,旋转.倾斜.缩放. transform:translate(0,300px); x代表的是水平的偏移距离,y代表垂直的. t ... 
