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;// 线程终止
} |
 
2/2 首页 上一页 1 2 |