当前位置: 首页 > news >正文

线程池框架

这是之前有做的一个可以接受用户传入任意类型的任务函数和任意参数,并且能拿到任务对应返回值的一个线程池框架,可以链接成动态库,用在相关项目里面。一共实现了两版,都是支持fixed和cached模式的,半同步半异步的(生产者消费者模型,异步 提交任务,获取任务结果,用future类达到异步)

今天就简单稍微做个小结。

 第一版

1、自己实现Any类,用来接收任意函数,和传递参数

2、怎么拿到返回值结果和结果类型?Result类里面 有Any类成员函数get 用来获取函数返回结果,Result构造函数里有Task类型对象,能接收到用户传入参数和类型,通过setvalue设置拿到返回值类型,通过getvalue获取task的返回值,最后返回一个Result类型打包的对象用来接收用户提交任务之后的返回值

3、用继承 重写虚函数的方式,定义Task任务类为抽象基类,用户设置自己的mtask类,自己实现里面run方法(线程怎么工作)

4、自己用mutex和condition_variable实现了信号量类

5、线程池析构,必须等所有线程把工作做完之后再析构

非必现的死锁问题:有时候线程资源释放回收之后会有线程没有回收干净

对于在阻塞队列里面没有拿到锁的休眠线程,和正在工作的线程没有问题;因为少考虑了一种情况,当threadpool要析构的时候,有线程执行完任务,又绕了一圈进到while,阻塞到拿锁那块,当threadpool析构执行到最后面释放锁的时候,因为用的都是一把锁,此时阻塞在锁的那个线程就拿到锁往下执行,但是会执行到notempty wait的地方,因为此时队列里线程还有他的存在,不空,但是析构函数已经走到最后面了,没人唤醒他,他就一直睡死在里面notempty wait这块了

问题就是notempty wait这块没人notify唤醒了,锁加双重判断,和把notify和获取锁代码位置换一下

还出现一个死锁问题:在linux平台下资源无法释放完全,因为linux下底层条件变量调用实现和windows不同,linux下condition_variable中notify阻塞了,查看源码发现在vs下条件变量析构会释放相关资源,而linux下的析构函数什么也没有做并没有释放资源,我们调用默认的析构,linux下肯定就会有问题
解决问题:在信号量类多加一个原子bool类型,构造的时候初始化false,重写析构将bool置为true。在信号量里post操作里加一层bool判断
分析定位问题:主要通过gdb attach到正在运行的进程,通过info threadsthread tidbt等命令查看各个线程的调用 堆栈信息,结合项目代码,定位到发生死锁的代码片段,分析死锁问题发生的原因

第二版

简化了代码引入future类和packaged_task打包 , packaged_task 调用get_future 获取 future , 然后通过 future 异步可以获取函数的返回值;使用可变参模板代替Any类

future->我们写的result类

http://www.lryc.cn/news/2853.html

相关文章:

  • 【TCP的拥塞控制】基于窗口的拥塞控制
  • STP协议基础
  • Linux上面配置Apache2支持Https(ssl)具体方案实现
  • [Linux]进程替换
  • 常见的锁策略面试题
  • 设计师一定要知道这几个网站,解决你80%的设计素材。
  • QT基础入门
  • 高数不定积分72题解答
  • 基于北方苍鹰算法优化LSTM(NGO-LSTM)研究(Matlab代码实现)
  • Linux内核启动(理论,0.11版本)分段与分页
  • 数据与C(字符串)
  • Python+Go实践(电商架构三)
  • 基于 MySQL 排它锁实现分布式可重入锁解决方案
  • 【大数据】Hadoop-HA-Federation-3.3.1集群高可用联邦安装部署文档(建议收藏哦)
  • 【设计模式之美 设计原则与思想:面向对象】14 | 实战二(下):如何利用面向对象设计和编程开发接口鉴权功能?
  • 工作技术小结
  • 无重复字符的最长子串-力扣3-java
  • java ssm高校教材管理平台 idea maven
  • 【Python学习笔记】25.Python3 输入和输出(1)
  • C++复习笔记8
  • RabbitMQ入门
  • 【计算机网络】Linux环境中的TCP网络编程
  • idekCTF 2022 比赛复现
  • jvm的类加载过程
  • VOC数据增强与调整大小
  • Linux 安装jenkins和jdk11
  • Pandas——Series操作【建议收藏】
  • JUC并发编程Ⅰ -- Java中的线程
  • 基于vue-admin-element开发后台管理系统【技术点整理】
  • 【C语言学习笔记】:通讯录管理系统