一个进程只能最多创建2000个线程吗?

news2024/11/25 4:35:53

我经常听到有人说,为什么不能创建一个包含2000个线程的进程。

原因不是Windows中固有的任何特定限制。相反,程序员没有考虑每个线程使用的地址空间量。

线程由内核模式下的一些内存(内核堆栈和对象管理)和用户模式下的一些内存(线程环境块、线程本地存储等)及其堆栈组成。(如果你使用的是安腾系统,则为多个堆栈。)

通常,限制因素是线程堆栈大小。

请看下面的代码:

此程序通常会打印一个大约 2000 的线程数值。
为什么大概会是2000这个数呢?

因为链接器分配的默认堆栈大小为 1MB,而 2000 个堆栈乘以每个堆栈 1MB 等于大约 2GB,这是用户模式程序可用的地址空间量。

你可以尝试通过减小堆栈大小将更多线程压缩到进程中,这可以通过调整链接器选项或手动重写传递给 CreateThread 函数的堆栈大小来完成,如 MSDN 中所述的那样。

HANDLE h = CreateThread(NULL, 4096, ThreadProc, NULL,
STACK_SIZE_PARAM_IS_A_RESERVATION, &id);

通过这个修改,我能够创建大约 13000 个线程。虽然这肯定比 2000 个要好,但它没有达到 500,000 个线程的天真期望(线程在 2GB 地址空间中使用 4KB 的堆栈)。但是你忘记了另一个开销。地址空间分配粒度为 64KB,因此即使仅使用 4KB 的地址空间,每个线程的堆栈也会占用 64KB 的地址空间。另外,当然,你不能自由支配所有2GB的地址空间;有系统 DLL 和其他东西占用它。

但是,每当有人问”一个进程可以创建的最大线程数是多少?”时,就会提出真正的问题是”为什么你创建了这么多线程,以至于线程数量成为了一个问题?”

众所周知,”每个客户端一个线程”的模型,不会扩展到十几个客户端左右。如果要同时处理超过这么多的客户端,则应转到一个模型,而不是将线程专用于客户端,而是没每个客户端分配一个对象。(总有一天,我会思考线程和对象之间的二元性。Windows 提供 I/O 完成端口和线程池,以帮助你从基于线程的模型转换为基于工作项的模型。)

请注意,纤程(Fibers)在这里没有多大帮助,因为纤程有一个堆栈,而堆栈所需的地址空间几乎始终是限制因素。

总结

Topomel Box 在开发中也会频繁使用线程来提升用户体验,但一般都是在短时间内线程完成了它的工作后就退出了,这样不会造成系统资源耗尽的问题。
如果有一天,你真的需要问出”一个进程能创建多少个线程”这个问题时,你需要仔细想想:为什么需要创建这么多线程?
“有没有可能,哪里设计的不合理?”

最后

Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《Does Windows have a limit of 2000 threads per process?》

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

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

相关文章

互动抽奖背后的随机性与算法实现

背景抽奖,是一种典型的互动玩法形式。无论是大V的粉丝抽奖,还是活动会场的参与抽奖,这种起源于彩票开奖的互动玩法,同时兼顾了高期待感和低预期的特征,让活动在成本控制之余又能有惊喜和引爆点,这样的优势让…

java毕业设计——基于java+Socket+sqlserver的远程监控系统软件设计与实现(毕业论文+程序源码)——远程监控系统

基于javaSocketsqlserver的远程监控系统软件设计与实现(毕业论文程序源码) 大家好,今天给大家介绍基于javaSocketsqlserver的远程监控系统软件设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦。 文章目录:…

安全智能分析技术 思路方案

思路方案 在安全领域的研究中我们发现,很多数据预处理的步骤,在不同的场景下中都可以相互 借鉴,甚至可以进行直接复用。例如,对于加密流量相关的数据,当算法工程师 获取到一批加密流量的 pcap 包之后,不论他…

【Linux学习】之将输出重定向到文件或程序

将输出重定向到文件或程序 文章目录将输出重定向到文件或程序1. 标准输入、标准输出和标准错误2. 输出重定向操作符2.1 用法及说明2.2 合并重定向运算符2.3 输出重定向示例2.4 输出重定向实例23. 构建管道3.1 含义3.2 管道示例1. 标准输入、标准输出和标准错误 进程使用称为文…

Ac-IYGEF-NH2,168781-78-0

Ac-IYGEF-amide, excellent small peptide substrate for the protein tyrosine kinase pp60c-src (Km 368 M and Vmax 1.02 mol min⁻ mg⁻). Ac-IYGEF-amide,蛋白酪氨酸激酶pp60c-src的优秀小肽底物(Km 368 μ M, Vmax 1.02 μ mol minmg)。 编号: 150669中文名称…

新冠“阳”后嗓子疼到只能喝粥?千万别错过这几条加速康复建议

你一定很熟悉这张传遍朋友圈的小照片。你周围的亲戚、朋友、同事,甚至你自己,可能已经变成了前几批“小阳人”,正在体验传说中的高热、肌痛、头痛、喉咙痛、持续咳嗽、食物不振、味觉和嗅觉丧失。此时此刻,每个人都想增加身体的战…

学习python技术难吗?

现如今Python这门语言的就业前景会非常好。相对于其他来说,它语法简单易读,消除了初学者对于“编程”这一行为的恐惧,让越来越多的非科班有信心开始通过编写简单的程序,究竟学习python技术难吗?关键在于你多注意小编这…

oracle学习篇(三)

oracle学习篇(三) 1 oracle伪列 1.1 查询rowid 1.1.1 示例代码 -- rowid 行id 添加时就生成了(删除某一列时,id会更随着一起删除,id在添加的时候就固定死了) SELECT rowid,e.* FROM emp e1.1.2 运行截图 1.2 查询rownum 1.2.1 示例代码 -- rownum 行号 查询时根据行数产生…

Jmeter(十六):jmeter场景的运行架构(本地运行和远程运行)配置远程负载机

jmeter场景的运行架构(本地运行和远程运行) 运行方式: GUI运行:通过图形界面方式运行,该运行方式的可视化界面及监听器动态展示 结果都比较消耗负载机资源,建议大并发时不用,一般进行脚本调试; 命令行运行…

LeetCode刷题复盘笔记—一文搞懂动态规划之188. 买卖股票的最佳时机 IV问题(动态规划系列第二十三篇)

今日主要总结一下动态规划的一道题目,188. 买卖股票的最佳时机 IV 题目:188. 买卖股票的最佳时机 IV Leetcode题目地址 题目描述: 给定一个整数数组 prices ,它的第 i 个元素 prices[i] 是一支给定的股票在第 i 天的价格。 设计…

带有匹配滤波器的雷达信号调制和脉冲压缩Matlab仿真

up目录 一、理论基础 二、核心程序 三、测试结果 一、理论基础 匹配滤波器: 匹配滤波器是输出端的信号瞬时功率与噪声平均功率的比值最大的线性滤波器也就是说有最大的信噪比。其滤波器的传递函数形式是信号频谱的共轭。在通信系统中,滤波器是其中重…

Selenium3自动化测试【40】Html测试报告

📌 博客主页: 程序员二黑 📌 专注于软件测试领域相关技术实践和思考,持续分享自动化软件测试开发干货知识! 📌 公号同名,欢迎加入我的测试交流群,我们一起交流学习! 目录…

Aspartic acid-PEG-BSA 天冬氨酸-聚乙二醇-牛血清白蛋白

产品名称:天冬氨酸-聚乙二醇-牛血清白蛋白 英文名称:Aspartic acid-PEG-BSA 纯度:95% 存储条件:-20C,避光,避湿 外观:固体或粘性液体,取决于分子量 PEG分子量可选:350、550、750、1k…

Android Kotlin使用APT手写ButterKnife

前言 ButterKnife通过使用BindView注解就可以完成findViewById工作,它的实现原理其实也很简单,通过APT(Annotation Processing Too,注解解析器)技术,在编译期为我们生成了一个绑定类,而从完成了View的绑定…

OpenAI掌门人Sam Altman:AI的下一个发展阶段

来源|Greylock OneFlow社区编译 翻译|胡燕君、贾川 预告了一整年的GPT-4迟迟没来,人们猜想OpenAI是不是要跳票了,更何况他们之前的得意之作DALL-E也被开源Stable Diffusion打了个措手不及,再不来点深水炸弹业界地位危矣…

jsp+ssm计算机毕业设计ssm学生成绩考核管理系统【附源码】

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: JSPSSM mybatis Maven等等组成,B/S模式 Mave…

对 CSS 工程化的理解

CSS 工程化是为了解决以下问题: 宏观设计:CSS 代码如何组织、如何拆分、模块结构怎样设计?编码优化:怎样写出更好的 CSS?构建:如何处理我的 CSS,才能让它的打包结果最优?可维护性&a…

SQL基础——查询基础

查询基础前言整体思维导图列的查询语法2.1 基本的SELECT语句代码示例:从Product表中输出3列执行结果查询出所有的列语法2.2 查询全部的列代码示例2.2 输出Product表中全部的列执行结果为列设置别名代码示例2.3 为列设置别名执行结果代码示例2.4 设置中文别名执行结果…

Redis持久化没玩明白,你就会把缓存数据丢了

引言 我们都知道Redis是微服务架构中重要的基础数据库中间件,通过Redis可以将数据库中的数据缓存到内存中,当服务端有数据查询请求的时候,可以直接从内存中获取数据。如此,一方面服务端可以获得比较快的数据请求响应,…

透明质酸-嵌段共聚物 透明质酸修饰聚乳酸 HA-PLA/PCL/PLGA/PEI/PLL

品牌:为华生物 产地:广州 中文名称:透明质酸-聚乳酸 英文名称:HA-PLA 溶解度:溶于部分有机溶剂 保存时间:一年 PLA分子量:根据客户要求定制 HA分子量:3000--1500K 其他分子量可根据客…