文档章节

线程池的设计(一):半同步半异步线程池的设计

苗永超
 苗永超
发布于 2016/04/07 20:11
字数 905
阅读 536
收藏 10

前置问答:

1.为什么要使用线程池? 避免大量创建和销毁线程,提升性能。

2.线程池主要工作流程?一是外部不断地向线程池添加任务,而是线程池内部不断地取任务执行,这是典型的生产者消费者模型。

3.线程池有几种类型?半同步半异步线程池 和 领导者追随者线程池。



第一部分:

半同步半异步线程池的工作流程:

代码实现:http://www.itdadao.com/2016/01/18/226136/

1.启动:启动若干个线程,每个线程函数内部会循环从任务队列中取任务,任务队列的内容就是线程函数的函数名。

   要点:

   a. 线程函数是需要传给线程池对象的,线程池只负责管理线程,并不关心具体的工作线程的任务内容。

   b. 刚启动线程池,没有传入任何任务时,此时线程池内的所有工作者线程处于阻塞等待状态(使用条件变量和互斥量),等待任务的到来。使用while(m_running)进行循环等待,当m_running为false时即为线程池停止服务时。

2.添加任务:向线程池申请线程执行任务,线程池对象内部会想任务队列push一个任务。

   要点:

   a. 向任务队列push任务时,同步队列内部会通过条件变量唤醒正在阻塞的等待任务的工作者线程。

   条件变量的使用过程如下:

   ①. 拥有条件变量的线程获取互斥量;

   ②. 循环检查某个条件,如果条件不满足,则阻塞线程直到条件满足。如果条件满足,向下执行;

   ③. 某个线程满足条件执行完之后调用notify_one或notify_all唤醒一个或所有等待的线程;

   b.任务执行结束后,工作者线程继续陷入等待状态,直到下一个任务来临。


3.停止:等待所有线程结束后停止线程池。

   要点:

   a. 保证停止操作只能被调用一次,需要加锁;

   b. 将同步队列停止,这样同步队列就不再提供新的任务;

   c. 将线程池运行状态标示m_running置为停止状态,保证工作者线程函数不再等待新任务的到来;

   d. 等待所有工作者线程退出后,将线程池内创建好的线程组清空,释放资源;


关于半同步半异步线程池问答:

1.半同步半异步线程池如何构造的?主要分三层:同步服务层,任务队列,异步服务层。

2.任务队列为什么需要设置上限?同步任务队列如果不加上线控制,会导致排队任务过多,内存暴涨。

3.生产者过度生产任务时,有什么影响?任务被处理的等待时间会很长。


参考文档:

《C++11并发指南三(Lock详解)》 http://www.cnblogs.com/haippy/p/3346477.html

《四种windows多线程通信方式》http://blog.csdn.net/bao_qibiao/article/details/4516196

《生产者消费者问题》 https://zh.wikipedia.org/wiki/生产者消费者问题

《领导者跟随者模式》 http://www.cppblog.com/jerryma/archive/2010/11/11/133325.html

《高性能IO设计模式概述》 http://www.yeolar.com/note/2012/12/15/high-performance-io-design-patterns


期待下一篇:线程池的设计(二):领导者追随者线程池的设计


转帖请标明出自:http://my.oschina.net/justfairytale/blog/654749




© 著作权归作者所有

共有 人打赏支持
苗永超
粉丝 15
博文 57
码字总数 14075
作品 0
海淀
后端工程师
私信 提问
加载中

评论(2)

苗永超
苗永超

引用来自“redrawafaith”的评论

不错不错
redrawafaith
redrawafaith
不错不错
线程池的设计(二):领导者追随者线程池的设计

接上文:线程池的设计(一):半同步半异步线程池的设计 领导者追随者模式在使用方式上与半同步半异步模式相同,以下主要介绍不同的实现部分,相同部分一笔带过。 本文讲述的只是领导者追随者...

苗永超
2016/04/11
219
0
服务器高并发设计模式

半同步/半异步模式 先解释一下同步和异步的区别,与刚才I/O的同步、异步不一样,在并发模式中,这里的“同步"指的是程序完全按照代码的顺序执行,“异步”指的是程序的执行需要由系统事件来驱...

满小茂
2016/04/13
184
0
服务器两种高效的并发模式

一、并发编程与并发模式 并发编程主要是为了让程序同时执行多个任务,并发编程对计算精密型没有优势,反而由于任务的切换使得效率变低。如果程序是IO精密型的,则由于IO操作远没有CPU的计算速...

翼动动空
2016/09/22
118
0
Linux下同步异步机制以及高性能服务器的相关话题

同步线程与异步线程的比较?(同样适合于同步进程和异步进程) 进程和线程的同步是指:程序的执行顺序完全由代码序列决定。 同步线程的特点: 代码逻辑简单,适合高并发量,但是效率低,实时...

LinuxCPlusPlus
2016/02/20
177
0
java高并发的异步【非阻塞】

高并发系统中,性能上要求处理时间够短,所以传统阻塞式开发(一个线程内一行行代码,一个个方法的顺序执行,直到完成)明显是不符合要求的,那么必须做到非阻塞式。如何来做: 我们能选择的...

Edwyn王
2016/08/16
49
0

没有更多内容

加载失败,请刷新页面

加载更多

6、消息发布和订阅功能

一:介绍 redis提供了简单的发布订阅功能,producer往某个channel推送,client订阅指定的channel(可以模糊匹配),这样就能够消费。 redis和rabbitmq的区别 可靠性 redis :没有相应的机制保...

刘付kin
45分钟前
1
0
OSChina 周日乱弹 —— 我重新说

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @宇辰OSC :分享矢野立美的单曲《LOVE Theme from TIGA <M-2>》: 《LOVE Theme from TIGA <M-2>》- 矢野立美 手机党少年们想听歌,请使劲儿戳...

小小编辑
今天
99
7
Java单例模式学习记录

在项目开发中经常能遇见的设计模式就是单例模式了,而实现的方式最常见的有两种:饿汉和饱汉(懒汉)。由于日常接触较多而研究的不够深入,导致面试的时候被询问到后有点没底,这里记录一下学习...

JerryLin123
昨天
10
0
VSCODE 无法调试

VSCODE 无法调试 可以运行 可能的原因: GCC 的参数忘了加 -g

shzwork
昨天
6
0
理解去中心化 稳定币 DAI

随着摩根大通推出JPM Coin 稳定币,可以预见稳定币将成为区块链落地的一大助推器。 坦白来讲,对于一个程序员的我来讲(不懂一点专业经济和金融),理解DAI的机制,真的有一点复杂。耐心看完...

Tiny熊
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部