线程池
有许多应用程序创建线程,这些线程花费大量时间处于休眠状态等待事件发生。 其他线程可能进入睡眠状态,只是定期唤醒以轮询更改或更新状态信息。 通过线程池 ,可以通过为应用程序提供由系统管理的工作线程池来更高效地使用线程。 至少一个线程监视排队到线程池的所有等待操作的状态。 等待操作完成后,线程池中的工作线程将执行相应的回调函数。
本主题介绍原始线程池 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 工作线程中发布异步 I/O 完成请求。
若要使用线程池,工作项及其调用的所有函数都必须是线程池安全的。 安全函数不假定执行它的线程是专用线程或永久性线程。 通常,应避免使用 线程本地存储 或进行需要持久线程的异步调用,例如 RegNotifyChangeKeyValue 函数。 但是,可以在应用程序) 创建的专用线程 (调用此类函数,或者使用 QueueUserWorkItem 和 WT_EXECUTEINPERSISTENTTHREAD 选项) 排队到持久性工作线程 (。
相关主题