什么是线程池

处理大量并发任务,一个请求一个线程来处理请求任务,大量的线程创建和销毁将过多的消耗系统资源,还增加了线程上下文切换开销。

线程池通过在系统中预先创建一定数量的线程,当任务请求到来时从线程池中分配一个预先创建的线程去处理任务,线程在处理任务之后还可以重用,不用销毁,从而节省系统资源。对于多核处理器,线程会被分配到多个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线程池的实现的更多相关文章

  1. 托管C++线程锁实现 c++11线程池

    托管C++线程锁实现   最近由于工作需要,开始写托管C++,由于C++11中的mutex,和future等类,托管C++不让调用(报错),所以自己实现了托管C++的线程锁. 该类可确保当一个线程位于 ...

  2. 简单的C++11线程池实现

    线程池的C++11简单实现,源代码来自Github上作者progschj,地址为:A simple C++11 Thread Pool implementation,具体博客可以参见Jakob's D ...

  3. c++11 线程池学习笔记 (一) 任务队列

    学习内容来自一下地址 http://www.cnblogs.com/qicosmos/p/4772486.html github https://github.com/qicosmos/cosmos ...

  4. c++11线程池实现

    咳咳.c++11 增加了线程库,从此告别了标准库不支持并发的历史. 然而 c++ 对于多线程的支持还是比較低级,略微高级一点的使用方法都须要自己去实现,譬如线程池.信号量等. 线程池(thread p ...

  5. c++ 11 线程池---完全使用c++ 11新特性

    前言: 目前网上的c++线程池资源多是使用老版本或者使用系统接口实现,使用c++ 11新特性的不多,最近研究了一下,实现一个简单版本,可实现任意任意参数函数的调用以及获得返回值. 0 前置知识 首先介 ...

  6. 基于C++11线程池

    1.包装线程对象 class task : public std::tr1::enable_shared_from_this<task> { public: task():exit_(fa ...

  7. 《java.util.concurrent 包源码阅读》11 线程池系列之ThreadPoolExecutor 第一部分

    先来看ThreadPoolExecutor的execute方法,这个方法能体现出一个Task被加入到线程池之后都发生了什么: public void execute(Runnable command) ...

  8. c++11线程池

    #pragma once #include <future> #include <vector> #include <atomic> #include <qu ...

  9. c++11 线程池

    也可参考: https://www.cnblogs.com/ailumiyana/p/10016965.html *** https://blog.csdn.net/jlusuoya/article/ ...

随机推荐

  1. 《剑指offer》面试题45 圆圈中最后剩下的数字(Java版本)

    引言 这道题网上的讲解都是直接抄书,没意思,所以想自己写一写,补充一下,便于自己理解.另外,大家都忽略了经典解法,虽然这种解法效率不及第二种,但是我觉得在项目当中阅读性其实很重要,牺牲一点点效率保证代 ...

  2. 转:RAC中比较replay, replayLast, and replayLazily

    A co-worker recently asked me about the difference between -replay, -replayLast, and -replayLazily i ...

  3. JAVA核心技术I---JAVA开发环境配置

    一:常常有看到Java SE,Java EE,Java ME,那么他们的区别呢? 1. Java SE(Java Platform,Standard Edition  java平台标准版). Java ...

  4. Ubuntu硬盘空间不足时,添加硬盘的方法

    Ubuntu下重新挂载一个硬盘:方法如下: 1 .在Vmware中关闭Ubuntu虚拟机,在设置中,添加新的硬件设备,选择Hard Disk.(这里如果不关闭Ubuntu系统就不能增加新的硬件设备) ...

  5. Challenge 18

    Challenge 18给你一个长度为 n 的非负整数序列 a 和 m 个询问 l, r, p, k,表示询问在 a[l .. r] 中 a[i]%p=k 的 i 的个数. 思路: 将序列分为根号n块 ...

  6. WCF: Retry when service is in fault state.

    Service Host: using System; using System.Configuration; using System.ServiceModel; using System.Serv ...

  7. HttpContext.Current為空匯總

    1. async異步模式下為空 解决办法: <httpRuntime targetFramework="4.5" /> 或者: In your appSettings, ...

  8. OAuth2:Authorization Flows

    Ref:http://www.dannysite.com/blog/176/ OAuth2.0协议定义了用于获得授权的四种主要授权类型. 1. Client Credentials 一种基于APP的密 ...

  9. CodeVS4416 FFF 团卧底的后宫

    题目描述 Description 你在某日收到了 FFF 团卧底的求助,在他某日旅游回来,他的后宫们出现了一些不可调和的矛盾,如果 FFF 团卧底把自己的宝贝分给 a 号妹子,那么 b 号妹子至少要在 ...

  10. windows 批处理文件调用exe

    @echo offstart "" "C:\Users\Administrator\Desktop\testtaotao\Debug\testtaotao.exe&quo ...