可以使用线程池来根据应用程序的需要更为有效地利用多个线程。许多应用程序使用多个线程,但这些线程经常在休眠状态中耗费大量的时间来等待事件发生。其他线程可能进入休眠状态,并且仅定期被唤醒以轮询更改或更新状态信息,然后再次进入休眠状态。使用线程池就可以为应用程序提供一个由系统管理的辅助线程池,从而使您可以集中精力于应用程序任务而不是线程管理。实际上,如果要执行一些需要多个线程的较短任务,则使用 ThreadPool 类是利用多个线程的最方便且最好的方法。使用线程池能够优化这些任务的执行过程,从而提高吞吐量,它不仅能够使系统针对此进程优化该执行过程,而且还能够使系统针对计算机上的其他进程优化该执行过程,即使您的应用程序对这些进程一无所知,系统也能做到这一点。使用线程池使系统能够在考虑到计算机上的所有当前进程后对线程时间片进行优化。

解决方案 »

  1.   

    线程池许多应用程序会创建一些线程,花费大量时间在睡眠状态以等待一个事件的发生。另外有些线程进入睡眠状态可能仅仅为了在处理状态信息更新或发生改变的时候被周期性地唤醒。线程池允许通过为应用程序提供由系统管理的工作器线程来更有效率地使用线程。至少有一个线程监控着所有在线程池中排队的等待操作。当一个等待操作被完成了,线程池中一个工作器线程救执行相应的回调函数。就算工作项目跟等待操作无关,你也可以将它排队到线程池中。要请求系统用线程池来处理一个工作项目,调用QueueUserWorkItem函数。该函数带有一个函数参数,在线程池选中它的时候,这个函数就将被执行。当一个工作项目已经被排入队列,就没有办法把它取消。时钟队列定时器和已注册等待操作也使用线程池。你也可以使用BindIoCompletionCallback 来投递异步的I/O操作。当I/O完成时,该回调函数就被线程池中的一条线程执行。线程池在你第一次调用QueueUserWorkItem或者BindIoCompletionCallback函数,或者时钟队列定时器和已注册等待操作将一个回调函数排队的时候创建。可以创建的线程个数仅受可用内存的限制。每个线程试用默认的堆栈大小并在默认的特权级下运行。线程池中有两种类型的工作器线程:I/O和非I/O的。一个I/O工作器线程是一个在警觉等待状态下等待的线程。工作项目作为异步过程调用(APC)排队到工作器线程盅。如果一个工作项目应当在一个处于警觉等待模式下等待的线程中执行,就应该将它排队到I/O线程中。非I/O工作器线程等待于I/O完成端口。使用非I/O工作器线程比I/O工作器线程更有效率。这意味着,只要可能你就应当使用非I/O工作器线程。I/O和非I/O工作器程不会在有未处理的异步I/O请求时退出。两种线程类型都可以被工作项目用来初始化异步I/O完成请求。然而,如果异步I/O完成请求需要长时间才能完成,应避免向非I/O工作器线程投递该请求。要使用线程池,工作项目和它调用的所有函数必须是线程池安全的。一个安全的函数不能假定它是运行在一个专属的或永久的线程盅。一般来说,你应当避免使用线程局部存储,也不应将那些需要永久性线程的异步排入队列,例如RegNotifyChangeKeyValue函数。然而,这些函数可以使用QueueUserWorkItem函数和WT_EXECUTEINPERSISTENTTHREAD选项排队到一个永久的线程中。注意线程池与单线程套间(STA)模型不兼容。