线程池概述

线程池

一个线程池的工作线程代表应用程序的高效执行异步回调的集合。线程池主要用于减少应用程序线程的数量并提供工作线程的管理。应用程序可以对工作项进行排队,将工作与可等待的句柄相关联,根据计时器自动排队,并与I / O绑定。

线程池架构

以下应用程序可以从使用线程池中受益:

  • 高度并行的应用程序,可以异步分派大量小工作项(例如分布式索引搜索或网络I / O)。
  • 一个创建和销毁大量线程的应用程序,每个线程都运行一小段时间。使用线程池可以降低线程管理的复杂性以及线程创建和销毁所涉及的开销。
  • 在后台和并行处理独立工作项的应用程序(例如加载多个选项卡)。
  • 必须对内核对象执行独占等待或阻止对象上的传入事件的应用程序。使用线程池可以减少线程管理的复杂性,并通过减少上下文切换的数量来提高性能。
  • 一个创建自定义服务器线程以等待事件的应用程序。

原始线程池已在Windows Vista中完全重新架构。新线程池得到改进,因为它提供单个工作线程类型(支持I / O和非I / O),不使用计时器线程,提供单个计时器队列,并提供专用的持久线程。它还提供清理组,更高的性能,独立调度的每个进程的多个池以及新的线程池API。

线程池架构包括以下内容:

  • 执行回调函数的工作线程
  • 等待多个等待句柄的服务员线程
  • 工作队列
  • 每个进程的默认线程池

最佳实践

新的线程池API原始线程池API提供更多的灵活性和控制。但是,有一些微妙但重要的差异。在原始API中,等待重置是自动的; 在新的API中,每次都必须显式重置等待。原始API自动处理模拟,将调用进程的安全上下文传递给线程。使用新API,应用程序必须显式设置安全上下文。

以下是使用线程池时的最佳做法:

  • 进程的线程共享线程池。单个工作线程可以一次执行多个回调函数。这些工作线程由线程池管理。因此,不要通过在线程上调用TerminateThread或通过从回调函数调用ExitThread终止线程池中的线程。
  • I / O请求可以在线程池中的任何线程上运行。取消线程池线程上的I / O需要同步,因为取消功能可能在与处理I /
    O请求的线程不同的线程上运行,这可能导致取消未知操作。为避免这种情况,请始终提供OVERLAPPED结构,在为异步I / O
    调用CancelIoEx时启动I / O请求,或使用您自己的同步确保在调用之前不能在目标线程上启动其他I /
    O.在CancelSynchronousIo或CancelIoEx功能。
  • 在从函数返回之前清除在回调函数中创建的所有资源。这些包括TLS,安全上下文,线程优先级和COM注册。回调函数还必须在返回之前恢复线程状态。
  • 保持等待句柄及其关联对象保持活动状态,直到线程池发出信号表示已完成句柄为止。
  • 标记正在等待冗长操作的所有线程(例如I / O刷新或资源清理),以便线程池可以分配新线程而不是等待这个线程。
  • 在卸载使用线程池的DLL之前,取消所有工作项,I / O,等待操作和计时器,并等待执行回调。
  • 通过消除工作项之间和回调之间的依赖关系,确保回调不等待自身完成,以及保留线程优先级,避免死锁。
  • 在使用默认线程池的其他组件的进程中,不要太快地排队太多项目。每个进程有一个默认线程池,包括Svchost.exe。默认情况下,每个线程池最多包含500个工作线程。当处于就绪/运行状态的工作线程数必须小于处理器数时,线程池会尝试创建更多工作线程。
  • 避免使用COM单线程单元模型,因为它与线程池不兼容。STA创建线程状态,可以影响线程的下一个工作项。STA通常是长期存在的并且具有线程亲和性,这与线程池相反。
  • 创建新的线程池以控制线程优先级和隔离,创建自定义特征,并可能提高响应能力。但是,其他线程池需要更多系统资源(线程,内核内存)。池太多会增加CPU争用的可能性。
  • 如果可能,使用可等待的对象而不是基于APC的机制来发出线程池线程的信号。APC与其他信令机制的线程池线程不兼容,因为系统控制线程池线程的生命周期,因此可以在传递通知之前终止线程。
  • 使用线程池调试器扩展名!tp。此命令具有以下用法:
    • 池地址 标志
    • obj 地址 标志
    • tqueue
    • 地址
    • 标志
    • 服务员地址
    • 工人地址
      对于pool,waiter和worker,如果地址为零,则命令将转储所有对象。对于服务员和工作人员,省略地址会转储当前线程。定义了以下标志:0x1(单行输出),0x2(转储成员)和0x4(转储池工作队列)。

相关话题

线程池API

使用线程池功能

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值