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

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


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

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


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

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

代码实现: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


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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值