热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C++控制台应用中的线程剖析与性能优化

在没有功能代码的C++控制台应用程序中,观察到有三个线程在运行。根据StackOverflow的解释,Windows操作系统为了加速进程启动,会在程序开始执行时利用多个CPU内核进行快速初始化,这涉及到`ntdll.dll`库的调用。通过深入了解这些线程的行为,可以更好地进行性能优化,提高应用程序的响应速度和效率。

在无任何功能代码的情况下运行控制台,会发现有三个线程在运行

 

 

 SO 的答案指出,在程序一开始运行时,为加快进程启动,windows 会利用多个 CPU 内核更快地初始化。

ntdll.dll 线程实际上是从链接的库启动的操作系统线程,所有代码都在线程 26372 上运行。

通常这些线程池工作者为应用程序加载其他动态库。

参考:why a c++ application has three threads started by default?

大概过半分钟后,ntdll.dll 线程就会自动消失

 

 因为 Windows 10 实现了一种加载 DLL 的新方法 - 多个工作线程并行执行 ( LdrpWorkCallback)。所有 Windows 10 进程现在都有几个这样的线程。

 创建了一个特殊的加载器线程池 - LdrpThreadPool,具有 LoaderThreads - 1 最大线程数。空闲超时设置为 30 秒(之后线程退出)

所以我们会发现只剩下一个线程了,详细解释见:Why there are three unexpected worker threads when a Win32 console application starts up?



 线程工具使用:VS 编译器中选择调试 -> 窗口 -> 线程,就会默认打开一个窗口,在代码上打个断点后,窗口就会自动出现线程信息

另外一个工具使用:pslist.exe 下载:https://docs.microsoft.com/en-us/sysinternals/downloads/pslist

使用命令:pslist.exe 查看所有进程的信息,包括线程的数量

                  pslist.exe -d pid  pid 为进程 ID,查看特定进程的线程信息



推荐阅读
  • Windows服务与数据库交互问题解析
    本文探讨了在Windows 10(64位)环境下开发的Windows服务,旨在定期向本地MS SQL Server (v.11)插入记录。尽管服务已成功安装并运行,但记录并未正确插入。我们将详细分析可能的原因及解决方案。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • CentOS7源码编译安装MySQL5.6
    2019独角兽企业重金招聘Python工程师标准一、先在cmake官网下个最新的cmake源码包cmake官网:https:www.cmake.org如此时最新 ... [详细]
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
  • 本文详细介绍了如何在Ubuntu系统中下载适用于Intel处理器的64位版本,涵盖了不同Linux发行版对64位架构的不同命名方式,并提供了具体的下载链接和步骤。 ... [详细]
  • golang常用库:配置文件解析库/管理工具viper使用
    golang常用库:配置文件解析库管理工具-viper使用-一、viper简介viper配置管理解析库,是由大神SteveFrancia开发,他在google领导着golang的 ... [详细]
  • PyCharm下载与安装指南
    本文详细介绍如何从官方渠道下载并安装PyCharm集成开发环境(IDE),涵盖Windows、macOS和Linux系统,同时提供详细的安装步骤及配置建议。 ... [详细]
  • 本文介绍如何使用Objective-C结合dispatch库进行并发编程,以提高素数计数任务的效率。通过对比纯C代码与引入并发机制后的代码,展示dispatch库的强大功能。 ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • 本文介绍了一款用于自动化部署 Linux 服务的 Bash 脚本。该脚本不仅涵盖了基本的文件复制和目录创建,还处理了系统服务的配置和启动,确保在多种 Linux 发行版上都能顺利运行。 ... [详细]
  • Android 渐变圆环加载控件实现
    本文介绍了如何在 Android 中创建一个自定义的渐变圆环加载控件,该控件已在多个知名应用中使用。我们将详细探讨其工作原理和实现方法。 ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • 本文详细探讨了Netty中Future及其子类的设计与实现,包括其在并发编程中的作用和具体应用场景。我们将介绍Future的继承体系、关键方法的实现细节,并讨论如何通过监听器和回调机制来处理异步任务的结果。 ... [详细]
  • andr ... [详细]
author-avatar
h619718610
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有