博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
线程池的设计(二):领导者追随者线程池的设计
阅读量:6364 次
发布时间:2019-06-23

本文共 1227 字,大约阅读时间需要 4 分钟。

hot3.png

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

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

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

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

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

代码实现:

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(上下文)

参照文档:

《领导者/追随者》

转帖请标明出自:

转载于:https://my.oschina.net/justfairytale/blog/656408

你可能感兴趣的文章
自动安装系统及网络安装服务
查看>>
11g RAC 更改归档模式 ,归档文件存放在ASM 磁盘组
查看>>
Visual Studio安装项目中将用户选择的安装路径写入注册表的方法[转]
查看>>
【转载】VBA:调用文件夹对话框的几种方法
查看>>
centos rm命令恢复删除的文件
查看>>
eclipse修改源码导出jar包
查看>>
5、根文件系统原理
查看>>
回档|过河
查看>>
perspective transform透视矩阵快速求法+矩形矫正
查看>>
go语言中在变量后加上接口是什么意思?
查看>>
day5-iptables
查看>>
版本配置
查看>>
python之进程
查看>>
wpf中嵌入winform控件的坑
查看>>
VMware Workstation and Hyper-V are not compatible. 解决方案
查看>>
POJ-3304Segments[计算几何]
查看>>
杭电2120--Ice_cream's world I(并查集)
查看>>
雅虎前段优化35条
查看>>
(转)接口100
查看>>
UIScrollView 大概是如何实现的,它是如何捕捉、响应手势的?
查看>>