执行与任务分离的组件— 线程池

wangbojing/threadpool​github.com

多线程技术主要解决了处理器单元内多个线程执行的问题,它可以显著的减少处理器单元的闲置时间,增加处理器单元的吞吐能力。线程池是多线程编程的一个必要组件,并且对于很多编程人员都是透明的,更是神秘的。

线程池的概念,是一个用来管理一组执行任务线程的工具。既然是管理工具,那么该工具管理是用来管理任务与执行的。如图一线程池组件拓扑图,执行队列(Workers),任务队列(Jobs)和池管理(Pool Manager)三部分组成。

执行队列(Workers)是用来存放运行线程的队列。

任务队列(Jobs)是用来存放需要被执行的任务队列。

池管理(Pool Manager)主要是管理执行队列的执行顺序,执行任务的时间长短,对长时间没有使用的执行单元进行释放,执行单元满负荷运行的时及时添加执行单元;记录未执行的任务数量,对新任务入队,即将执行的任务出队等等。

图一 线程池组件拓扑图

执行队列(Workers)中的每一个执行单元(Worker)由哪些元素组成?线程ID,退出标志。

任务队列(Jobs)中的每一个任务(Jobs)的组成元素?执行每一个任务的具体执行函数,每一个任务的执行参数。

池管理(Pool Manager)由哪些元素组成?每一个新任务添加与执行时的移除用的互斥锁,每一个线程挂起的时所等待的条件变量。

根据分析如图二线程池的类图。

图二线程池的类图

到这里一个简单的线程池就已经可以呼之欲出了。以下为实现代码

#include 

这样的线程池还是只是一个Demo,原因有如下几点需要我们值得改进的。

  1. 线程池的线程数量是确定的,不能随着系统任务请求数量放缩线程池的大小。
  2. 任务数量的统计,并没有对任务队列进行统计
  3. 执行任务中的线程数量,等待执行的任务数量进行统计
  4. 每一个执行任务的时间没有做限制,
  5. IO密集型与计算密集型区分,线程池非常常用,但是根据不同的业务场景需要设置不同配置
  6. 在用户任务执行函数里,用户主动的调用了pthread_exit退出线程的保护机制

针对于以上几点问题,改进了一版线程池

#include 

c语言 多个线程对同一变量执行memcpy_手把手带你实现线程池相关推荐

  1. c语言 多个线程对同一变量执行memcpy_你可曾听过网络编程中应用线程本地存储?...

    壹:你可曾听过线程本地存储? 1. 什么是线程本地存储? 线程本地存储:thread local storage(简称TLS).也叫线程特有存储:thread specific storage(简称T ...

  2. Python 多个线程按先后顺序执行,并保持各子线程和主线程的通信

    Python 多个线程按先后顺序执行,并保持各子线程和主线程的通信 摘要 最近有个项目使用pyqt5写的界面,界面展示部分作为项目的主线程,另外通过调用Thread,传入不同的参数又设置了五个子线程, ...

  3. c语言 多个线程对同一变量执行memcpy_PHP 进阶之路 - 揭开 PHP 线程安全的神秘面纱

    变量的作用域 从作用域上来说,C语言可以定义4种不同的变量:全局变量,静态全局变量,局部变量,静态局部变量. 下面仅从函数作用域的角度分析一下不同的变量,假设所有变量声明不重名. 全局变量(int g ...

  4. 百度java的线程技术_自我提升(基础技术篇)——java线程简介

    前言:虽然自己平时都在用多线程,也能完成基本的工作需求,但总觉得,还是对线程没有一个系统的概念,所以,查阅了一些资料,理解那些大神和官方的资料,写这么一篇关于线程的文章 本来想废话一番,讲讲自己的经历 ...

  5. 当前线程等待某些线程运行结束再执行的几种方案。CountDownLatch机制简单解读以及简单实现

    需求背景:如果没有采取什么措施,在开启分支线程后,当前线程继续往后执行,而不会阻塞等待分支线程,代码及运行结果如下. 1. Thread类的join方法 优点:如果当前线程需要指定某些线程结束后再执行 ...

  6. volatile能保持线程安全吗_从volatile说到i++的线程安全问题

    一般说来,volaTIle用在如下的几个地方: 1.中断服务程序中修改的供其它程序检测的变量需要加volaTIle: 2.多任务环境下各任务间共享的标志应该加volaTIle: 3.存储器映射的硬件寄 ...

  7. c语言哪些变量不要加锁,[转]关于ReentrantLock中线程读某个变量是否需要加锁

    我在使用ReentrantLock类对变量进行多线程累加时,调用了lock()和unlock()方法,但读取该变量时我未加锁,结果是能正确执行,代码如下: public class Main { pr ...

  8. linux C语言多线程库pthread中条件变量的正确用法逐步详解

    linux C语言多线程库pthread中条件变量的正确用法: 了解pthread常用多线程API和pthread互斥锁,但是对条件变量完全不知道或者不完全了解的人群. 关于条件变量的典型应用,可以参 ...

  9. (四)多线程说学逗唱:线程险恶,变量和线程安全不得不防

    (一)多线程说学逗唱:关于线程那不得不说的二三事 (二)多线程说学逗唱:新手村偶遇Thread类 (三)多线程说学逗唱:村口的老R头是个扫地僧(Runnable) (五)多线程说学逗唱:打铁还需自身硬 ...

最新文章

  1. Java的原始数据类型一共就8个
  2. 【视觉项目】【day1】8.20号实验记录(初步使用模板匹配)
  3. 这些解决 Bug 的套路,你都会了不?
  4. 微信小程序富文本rich-text使用详解-微信小程序系统学习攻略​
  5. (暴力求解)百钱买百鸡问题升级版
  6. 导数/微分/积分的区别
  7. windows系统bat批处理 管理nginx启动 nginx脚本管理bat脚本管理生命周期windows一键nginx启动
  8. tomcat 启动报错 解决办法 A child container failed duringnbsp
  9. 解决pycharm问题:module 'pip' has no attribute 'main'
  10. ax200蓝牙驱动linux,AX200蓝牙驱动
  11. 量化交易----常见股票特征和编程实现
  12. linux端口映射到内网机器,linux如何将公网IP映射到局域网IP?
  13. 关于射频技术在粮食安全的科研进展
  14. 【说不得得半路出家】对一个html案例模版的小小修改
  15. 单位电脑禁用u盘_组策略禁止u盘_注册表禁止u盘
  16. 阿里云虚拟机转让(RAM创建账户)
  17. UDS——ISO14229
  18. 高级数据库三:浅谈数据库事务(transaction)
  19. 数字货币钱包 HD Wallet的助记词和种子的生成原理(BIP39)
  20. 检测不到声卡High Definition Audio控制器显示代码10?驱动人生教你如何解决问题

热门文章

  1. java set的first_Java TreeSet pollFirst()方法与示例
  2. C语言1的阶级加3的阶级,第六天学C语音(一点分支与循环+n的阶层的练习)
  3. 数字图像处理之图像几何变换
  4. [蓝桥杯]算法提高 第二点五个不高兴的小明(记忆化搜索||动态规划)
  5. 样式图片_中式门窗花格图片大全样式全面选择多
  6. java mysql dao_Java DAO 模式
  7. HTTP概念详解与案例测试
  8. 2008服务器系统功能,Windows Server 2008 DNS服务器新增功能
  9. spark教程python案例_Spark实战(四)spark+python快速入门实战小例子(PySpark)
  10. 『操作系统』 进程的描述与控制 Part2 进程同步