线程池概述

线程池

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

使用线程池功能

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/448204.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WEB 请求处理二:Nginx 请求 反向代理

上一篇《WEB请求处理一:浏览器请求发起处理》,我们讲述了浏览器端请求发起过程,通过DNS域名解析服务器IP,并建立TCP连接,发送HTTP请求。本文将讲述请求到达反向代理服务器的一个处理过程,比如:在…

方向盘的正确驾驭方法

如果问您油门踏板和方向盘哪个与驾驶员最“亲密”,您会选择谁呢?恐怕还是方向盘吧。如果汽车行驶过程中您的双手同时离开了方向盘,那么事故的隐患也就随之而来。下面我们就为您全面介绍汽车方向盘的正确使用方法。专家介绍,握方向…

SQL server 2005中无法新建作业(Job)的问题

客户端是使用企业管理其(Management Studio)新建job,总是无法创建,查找了很多资料,有的说是需要sp2, 但有的又说不是... ... 没有时间去研究为什么,但确有一种方法解决:到服务器端去创建job&…

线程池API

线程池API 线程池应用程序编程接口(API)使用基于对象的设计。以下每个对象都由用户模式数据结构表示: 池对象是一组可用于执行工作的工作线程。每个进程可以根据需要创建具有不同特征的多个隔离池。每个进程都有一个默认池。清理组与一组回…

WEB 请求处理 一:浏览器 请求发起处理

最近,终于要把《WEB请求处理系列》提上日程了,一直答应小伙伴们给分享一套完整的WEB请求处理流程:从浏览器、Nginx、Servlet容器,最终到应用程序WEB请求的一个处理流程,前段时间由于其他工作事情的安排,一直…

离合器半联动探秘

离合器踏板作用是切断发动机和变速箱之间的动力,有利于起步、变速、和停车。那么如何更好的使用它呢? 离合器的五种状态示意图 离合器半联动的使用方法揭密如下: 离合器半联动的使用探密之一 将离合器抬到车开始动时你就别再抬了,…

Biztalk Server 2006安装配置

前段时间收到了来自beta.microsoft.com的BTS20006 Beta2的下载地址,这两天对它进行了一番安装配置。下面把一些经过和步骤和大家分享一下,手中有一些去年的Biztalk Server2004版本的培训资料,里面有11个Lab。需要的朋友请留下mail&#xff0c…

apache 官方 Dubbo 文档

只是分享、记录一下 dubbo 的文档地址:apache 官方 Dubbo 文档 其页面内容如下:(我是用 chrome 直接右键翻译的,原文档是英文的)

制动踏板是什么?

制动踏板就是脚刹(行车制动器)的踏板,使运行中的机车、车辆及其他运输工具或机械等停止或减低速度的动作。制动的一般原理是在机器的高速轴上固定一个轮或盘,在机座上安装与之相适应的闸瓦、带或盘,在外力作用下使之产…

CSS Framework 960 Grid System (收)

CSS框架 :960 Grid System 官网:http://960.gs/ 什么是框架?框架是一种你能够使用在你的web项目中概念上的结构。CSS框架一般是CSS文件的集合,包括基本风格的字体排版,表单样式,表格布局等等,比…

使用线程本地存储

线程本地存储(TLS)使同一进程的多个线程能够使用由TlsAlloc函数分配的索引来存储和检索线程本地的值。在此示例中,在进程启动时分配索引。当每个线程启动时,它会分配一个动态内存块,并使用TlsSetValue函数在TLS槽中存储…

发动机的工作原理,你知道吗?

http://auto.jxedt.com/info/5352.htm 发动机是汽车的动力装置,性能优劣直接影响到汽车性能,发动机的类型很多,结构各异,以适应不同车型的需要。按发动机使用燃料划分,可分成汽油发动机和柴油发动机等类别。按发动机汽…

官方文档: Dubbo 框架设计、模块说明、依赖关系

以下内容全文转自 apache 官方 dubbo文档:http://dubbo.apache.org/en-us/docs/dev/design.html 框架设计 图片描述: 浅蓝色背景的左侧区域显示服务用户界面,浅绿色背景的右侧区域显示服务提供者界面,中心区域显示两个侧面界面。…

那些花儿

今天上海下雨了,心绪也变得低落,突然很想念宿舍的姐妹。毕业后就自作聪明地和她们失去了联系,今天去QQ群遛了一圈。虹结婚了,敏还是活得那么潇洒,笑也在努力地生活... 人生啊!总是在向前走,遇…

CreateRemoteThread函数

CreateRemoteThread函数 创建在另一个进程的虚拟地址空间中运行的线程。 使用CreateRemoteThreadEx函数创建在另一个进程的虚拟地址空间中运行的线程,并可选择指定扩展属性。 语法 HANDLE CreateRemoteThread(HANDLE hProcess,LPSECURITY_ATTRI…

防火墙问题 Linux系统 /etc/sysconfig/路径下无iptables文件

虚拟机新装了一个CentOs7,然后做防火墙配置的时候找不到iptables文件,解决方法如下: 因为默认使用的是firewall作为防火墙,把他停掉装个iptable systemctl stop firewalld systemctl mask firewalld yum install -y iptables yum …

如果风 知道 ... 如果云 知道 ...

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 //《心灵之音》----- Bandari 来自酷狗。 一直很喜欢听歌: 喜欢默默的听、一个人安安静静的听、长长久久的听、听得忘乎所…

切记!这样洗头最伤身

各种的忙碌已经成为了现代人生活中的一个标志,每天的加班,玩乐到深夜,游戏等,都让不少的人的洗澡时间都只能在临睡前,而女人洗头也只能在晚上临睡之前洗。如果可以有足够的时间,等待头发完全干透了之后&…

可以供MFC调用的,QT实现的DLL(qtwinmigrate实现)

MFC和QT的消息循环机制不同&#xff0c;所以&#xff0c;要让QT写的DLL可以供MFC调用&#xff0c;要做一点特殊的处理 #include <qmfcapp.h> #include <qwinwidget.h> #include <QtGui>#include <QtGui/QMessageBox> #include <windows.h> #incl…

离合器的操作技巧

学车其实不难&#xff0c;学车最基本的几个操作&#xff0c;打方向盘、踩离合、踩刹车、换档位都是学员需要必学的基本操作&#xff0c;在网络驾校上有学员反应&#xff0c;对离合器的操作比较难&#xff0c;经常错误操作造成熄火等现象&#xff0c;现在泸州驾校论坛小编整理了…