AutoCAD 3DMAX C语言 Pro/E UG JAVA编程 PHP编程 Maya动画 Matlab应用 Android
Photoshop Word Excel flash VB编程 VC编程 Coreldraw SolidWorks A Designer Unity3D
 首页 > C++

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

51自学网 http://www.wanshiok.com

  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;// 线程终止

}


 

 
 

上一篇:深入探讨C++中的引用  下一篇:C++程序设计语言编程风格演变史