什么是线程池

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

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

    oracle中用于生成随机数的包:DBMS_RANDOM,这个包里面包含了很多方法,以下列出几个常用的方法 1.DBMS_RANDOM.RANDOM方法: FUNCTION random RETURN ...

  2. TCP、UDP绑定同一端口通信的解释

    昨日突然讨论起TCP与UDP是否可以在同一端口进行绑定,通信. 在印象当中我记得是可以的,今日google了相关资料, 确定以及肯定的: TCP.UDP可以绑定同一端口来进行通信: 网络中可以被命名和 ...

  3. 根据Bool值挑选数组中元素

    根据Bool值挑选数组中元素 觉得有用的话,欢迎一起讨论相互学习~Follow Me 使用Boolean类型的数组挑选一维数组中的值 使用一维Boolean数组选取数组中的特定元素,对应位置为True ...

  4. Vue.js学习笔记(一)

    其它前端主流框架可以做的事,Vue.js几乎都可以做, nuxt框架:可以实现vue的服务器端渲染, weex:使用vue语法编写原生app. 基础内容 基础语法 MVVM设计模式 前端组件化 vue ...

  5. Java并发编程原理与实战三十七:线程池的原理与使用

    一.简介 线程池在我们的高并发环境下,实际应用是非常多的!!适用频率非常高! 有过使用过Executors框架的朋友,可能不太知道底层的实现,这里就是讲Executors是由ThreadPoolExe ...

  6. puppeteer截图

    puppeteer是谷歌官方出品的一个通过 DevTools 协议控制 headless Chrome 的Node库.可以通过Puppeteer的提供的api直接控制Chrome模拟大部分用户操作来进 ...

  7. Java写的数据库连接池

    原文地址: http://lgscofield.iteye.com/blog/1820521 import java.sql.*; import java.util.Enumeration; impo ...

  8. 面向对象__construct(构造方法)、__destruct(析构方法)

    //1.创建子类的时候构造函数会直接取创建函数时传的参数,例如下面例子中构造函数直接取了new Person("张三","男", 20);里面的3个参数. // ...

  9. HDU 1176 排列2 全排列

    解题报告:给出四个数,然后要你把这四个数组合成的各不相同的四位数按照从小到大的顺序输出来,然后如果最高位是0的话不能输出来,还有最高位是数字如果一样的话,则放在同一行输出. 本来是个比较简单的生成全排 ...

  10. 【leetcode 简单】 第六十九题 删除链表中的节点

    请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点. 现有一个链表 -- head = [4,5,1,9],它可以表示为: 4 -> 5 -> 1 - ...