文档章节

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

苗永超
 苗永超
发布于 2016/04/11 01:08
字数 677
阅读 311
收藏 8

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


领导者追随者模式在使用方式上与半同步半异步模式相同,以下主要介绍不同的实现部分,相同部分一笔带过。

本文讲述的只是领导者追随者线程池的一种实现,不得不说,这种模式真的很复杂。 


两种模式的主要区别在于任务队列的实现

领导者追随者线程池的工作流程:

代码实现:https://github.com/421986908/Leader_Followers


1.启动

a.生成一组线程,放入线程数据;

2.添加任务

a.任务队列的实现是一个单向链表,添加任务就是向链表的表尾添加一个元素;

任务队列的实现

   ①. 每一个任务的具体定义应包含以下结构:线程函数名、线程函数传入的参数和指向下一个任务的指针。结构体定义如下: 

struct job
{
    void* (*callback_function)(void *arg);
    void *arg;
    struct job *next;
};

   ②. 新增任务时,同样要先判断queue_cur_num是否大于max_queue_num,判断线程池和队列是否处于服务的状态。添加任务只要将任务添加到链表的表尾即可,核心代码片段如下:

pjob->callback_function = callback_function;
pjob->arg = arg;
pjob->next = NULL;
if(pool->head == NULL)
{
    pool->head = pool->tail = pjob;
}
else
{
    pool->tail->next = pjob;
    pool->tail = pjob;
}

  工作者线程在结束任务后,会继续进入wait状态,相当于重新进入排队。此例中的任务队列可以类比于机场打车时的乘客队列,而工作者线程就相当于出租车。

   ③. 工作者线程wait到新任务时,会首先进行任务队列的操作,即转换领导者的身份,选出单链表表头的下一位为领导者,同时要注意维护队列的长度queue_cur_num,核心代码片段如下: 

pool->queue_cur_num--;
pjob = pool->head;
if(pool->queue_cur_num == 0)
{
    pool->head = pool->tail = NULL;
}
else
{
    pool->head = pjob->next;
}

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


关于领导者追随者线程池问答:

1.相比半同步半异步线程池,领导者追随者的优势在哪里? 不用进行线程间的上下文切换,性能得到提高。

T(L/F)=T(多路分离)+T(分配)+T(处理)+T(同步)+T(上下文)

T(H/H)=T(多路分离)+T(分配)+T(处理)+T(同步)+T(数据传递)+T(上下文)


参照文档:

《领导者/追随者》http://blog.csdn.net/hzhsan/article/details/25018167


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


© 著作权归作者所有

共有 人打赏支持
苗永超
粉丝 15
博文 57
码字总数 14075
作品 0
海淀
后端工程师
私信 提问
线程池的设计(一):半同步半异步线程池的设计

前置问答: 1.为什么要使用线程池? 避免大量创建和销毁线程,提升性能。 2.线程池主要工作流程?一是外部不断地向线程池添加任务,而是线程池内部不断地取任务执行,这是典型的生产者消费者...

苗永超
2016/04/07
466
2
服务器两种高效的并发模式

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

翼动动空
2016/09/22
118
0
服务器高并发设计模式

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

满小茂
2016/04/13
184
0
TCP 连接管理 tcpdaemon 版本更新至 v1.1.0

tcpdaemon版本更新至v1.1.0 2014-07-17 calvin: * 重整了代码结构 * 去除了异构模式 * 新增线程池模型,支持WINDOWS环境 tcpdaemon是类似于xinetd的TCP守护服务,它封装提供了各种常见TCP连...

calvinwilliams
2014/07/18
1K
3
线程池(领导者-追随者,生产者-消费者等)小结

领导者/追随者模型(Leader/Followers) 这几天翻了些文章,发现对领导者/追随者模型说的比较少,下面就这个模型打个比方: 话说一个地方有一群有组织无纪律的人从事山贼这个很有前途的职业。...

长平狐
2013/01/06
649
0

没有更多内容

加载失败,请刷新页面

加载更多

grafana安装使用及与zabbix集成

grafana简介 Grafana是一个完全开源的度量分析与可视化平台,可对来自各种各种数据源的数据进行查询、分析、可视化处理以及配置告警。 Grafana支持的数据源: 官方:Graphite,InfluxDB,Ope...

阿dai学长
37分钟前
7
0
带你看数据挖掘与机器学习-厦大EDP上课出勤预测

带你看数据挖掘与机器学习-厦大EDP上课出勤预测 标签: 数据挖掘 特征工程 机器学习 出勤预测 write by xmhexi 2019/3/22 内容提要 首先说明本文是一篇科普文章,通过一个实际案例,帮助理解什...

xmhexi
今天
100
0
IOS  学习记录

1.StackView=>IOS 9及以上支持 2.布局方式: AutoLayout / StackView 堆布局 (线性布局) 3.屏幕适配 (资源分辨率、设计分辨率、屏幕分辨率) Size Class技术 可以针对 屏幕的方向进行设置...

萨x姆
今天
5
0
第四次工业革命:自主经济的崛起

https://36kr.com/p/5170370.html

shengjuntu
昨天
5
0
Cloud Native 与12-Factor

12-Factor(twelve-factor),也称为“十二要素”,是一套流行的应用程序开发原则。Cloud Native架构中使用12-Factor作为设计准则。 12-Factor 的目标在于: 使用标准化流程自动配置,从而使...

waylau
昨天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部