利用C++语言设计可扩展线程池(2)

本文探讨了线程池的任务分配策略,特别是针对轻量级任务的高效处理方式。通过给单个线程分配多个轻量级任务来减少任务调度开销,提高系统资源利用率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

3、任务分配策略

  在业务处理中,会有各种各样的任务对象,这些业务对象对系统资源的使用也不同。这些任务,无论其空间复杂度如何,从线程执行任务这一角度来看,应该关心的主要是时间复杂度。

  线程缓冲池在接收到新任务的时候,首先要寻找空闲线程,传入新任务,然后执行任务,最后还要删除任务,置空闲线程的标志。寻找空闲线程、传入任务、最后的清理工作,这些都是为了执行任务而产生的额外开销,如果所执行的任务大多数都是轻量级任务,那么额外开销带来的资源浪费就显得很突出了。为了解决这个问题,可以给一个线程传入N5个轻量级任务,这一个线程依次执行N5个轻量级任务,由于都是在很短时间内完成,并不影响任务响应的及时性。显然,N5≥1。

  实现

  由于源代码的篇幅关系,并不能把所有代码一一列举,这里以伪代码的形式给出线程缓冲池在线程的创建、销毁、任务分配以及任务执行方面的流程。

  (1) 线程池任务分配主循环(也是一个线程)

  这里除了任务分配算法外也包括了部分线程的创建与销毁的算法。

 

for(;;) {

pThread = GetIdleThread();// 检查空闲线程队列

if( pThread != NULL ) {

if( CheckNewTask() ) {// 有新任务

TaskList tl;

GetTask( tl ); // 取得一定数量的任务

AddTaskToThread( pTask, tl );// 把任务传入线程

continue; // 继续循环

}

}

if( pThread == NULL && nThread < THREAD_MAX )// 没有空闲线程了

CreateNewThread();// 创建新线程

continue;// 继续循环

}

// 没有要处理的任务或者已经到达线程数的上限,进入超时等待

if( WaitForTaskOrThreadTimeout() ) {

if( IncrIdleTime() > IDLE_MAX ) { // 系统空闲,计时

// 系统长时间处于空闲,销毁一定数量的空闲线程

DecrIdleThread();

}

}

else

return 0;// 线程终止

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值