有许多应用程序创建线程,在休眠状态下花费大量时间等待事件发生。其他线程可以进入休眠状态,仅定期唤醒以轮询更改或更新状态信息。线程池使您可以通过为应用程序提供由系统管理的工作线程池来更有效地使用线程。至少有一个线程监视排队到线程池的所有等待操作的状态。等待操作完成后,来自线程池的工作线程执行相应的回调函数。
本主题描述了原始线程池API。Windows Vista中引入的线程池API更简单,更可靠,性能更好,并为开发人员提供了更大的灵活性。有关当前线程池API的信息,请参阅线程池概述。
您还可以将与等待操作无关的工作项排队到线程池。要请求线程池中的线程处理工作项,请调用QueueUserWorkItem函数。此函数接受将从线程池中选择的线程调用的函数的参数。排队后无法取消工作项。
定时器队列定时器和注册的等待操作也使用线程池。它们的回调函数排队到线程池。您还可以使用BindIoCompletionCallback函数发布异步I / O操作。完成I / O后,回调由线程池线程执行。
线程池是在您第一次调用QueueUserWorkItem或BindIoCompletionCallback时创建的,或者是在计时器队列计时器或已注册的等待操作对回调函数进行排队时创建的。默认情况下,可以在线程池中创建的线程数约为500.每个线程使用默认堆栈大小并以默认优先级运行。
线程池中有两种类型的工作线程: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工作线程中发布异步I / O完成请求。
要使用线程池,它们调用的工作项和所有函数必须是线程池安全的。安全函数不假定执行它的线程是专用或持久线程。通常,应避免使用线程本地存储或进行需要持久线程的异步调用,例如RegNotifyChangeKeyValue函数。但是,可以在专用线程(由应用程序创建)或排队到持久工作线程(使用带有WT_EXECUTEINPERSISTENTTHREAD选项的QueueUserWorkItem)上调用此类函数。