翻译《The Old New Thing》- Does Windows have a limit of 2000 threads per process?

news2024/9/20 22:26:11

Does Windows have a limit of 2000 threads per process? - The Old New Thing (microsoft.com)icon-default.png?t=N7T8https://devblogs.microsoft.com/oldnewthing/20050729-14/?p=34773

Raymond Chen 2005年07月29日


Windows 是否有一个每个进程2000线程的限制?

简要

        文章解释了在 Windows 程序中创建超过 2000 个线程的限制并非由操作系统本身设定,而是由于每个线程需要分配栈空间,这会消耗大量的地址空间。通过减少每个线程的栈大小,可以增加线程的数量,但这种做法并不推荐,因为它会导致性能下降和潜在的稳定性问题。作者建议使用 I/O 完成端口和线程池等机制来更有效地处理大量并发任务。

 

正文

        经常有人问为什么他们不能在一个进程中创建超过大约2000个线程。原因并不是 Windows 本身有任何特定的限制。相反,是程序员没有考虑到每个线程使用的地址空间量。

        一个线程由一些在内核模式下的内存(内核栈和对象管理)、一些在用户模式下的内存(线程环境块、线程局部存储等)以及它的栈组成。(或者如果你在 Itanium 系统上,是栈们。)

        通常,限制因素是栈的大小。

#include <cstdio>
#include <windows.h>

DWORD CALLBACK ThreadProc(void*) {
 Sleep(INFINITE);
 return 0;
}

int __cdecl main(int argc, const char* argv[]) {
 int i;
 for (i = 0; i < 100000; i++) {
  DWORD id;
  HANDLE h = CreateThread(NULL, 0, ThreadProc, NULL, 0, &id);
  if (!h) break;
  CloseHandle(h);
 }
 printf("Created %d threads\n", i);
 return 0;
}

        这个程序通常会打印出大约2000个线程的数量。

        为什么在大约2000个线程时失败?

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

        你可以通过减少栈大小来尝试将更多的线程压缩到你的进程中,这可以通过调整链接器选项或手动覆盖传递给 CreateThread 函数的栈大小来实现,如 MSDN 所述。

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

        通过这个改变,我能够勉强创建大约 13000 个线程。虽然这当然比 2000 个好,但离天真的期望 500000 个线程还有差距。(在 2GB 的地址空间中,一个线程使用 4KB 的栈。)但你忘记了其他的开销。地址空间分配粒度是 64KB,因此即使只使用了 4KB,每个线程的栈也占用 64KB 的地址空间。当然,你并不是可以自由地使用全部 2GB 的地址空间;还有系统 DLL 和其他东西占用了它。

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

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

        请注意,纤程在这里并没有太大帮助,因为纤程有一个栈,而且几乎总是栈所需的地址空间是限制因素。

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

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

相关文章

一键生成AI数字人短视频工具推荐!

数字人是什么&#xff1f;是利用人工智能技术实现与真人直播形象的1:1克隆&#xff0c;即克隆出一个数字化的你自己&#xff0c;包括你的形象、表情、动作和声音都会被克隆下来&#xff0c;让你能够拥有接近真人的表现力。 怎样使用数字人一天生成上百条短视频&#xff0c;无需…

Java中导入Maven项目

Maven坐标 maven坐标是资源的唯一标识&#xff0c;通过坐标可以唯一定位资源位置 使用坐标来定义项目或引入项目中需要的依赖 Maven坐标的组成 groupId&#xff1a;定义当前Maven项目隶属组织名称&#xff08;通常是域名反写 例如&#xff1a;com.ming&#xff09; artifa…

AI视频教程下载:用ChatGP在24小时内制作发布畅销电子书

这门变革性的课程使您能够利用内容生成和自行出版的新兴AI世界。利用ChatGPT 4等尖端人工智能工具&#xff0c;也称为ChatGPT Plus&#xff0c;您将获得所需的技能集&#xff0c;以创建引人入胜的内容&#xff0c;掌握设计&#xff0c;并成为亚马逊KDP上成功的自行出版作者 。 …

电商技术揭秘三十九:电商智能风控技术架构设计

相关系列文章 电商技术揭秘相关系列文章合集&#xff08;1&#xff09; 电商技术揭秘相关系列文章合集&#xff08;2&#xff09; 电商技术揭秘二十八&#xff1a;安全与合规性保障 电商技术揭秘二十九&#xff1a;电商法律合规浅析 电商技术揭秘三十&#xff1a;知识产权保…

原型模式类图与代码

现要求实现一个能够自动生成求职简历的程序&#xff0c;简历的基本内容包括求职者的姓名、性别、年龄及工作经历。希望每份简历中的工作经历有所不同&#xff0c;并尽量减少程序中的重复代码。 采用原型模式(Prototype)来实现上述要求&#xff0c;得到如图 7.25 所示的类图。 原…

FreeRTOS任务详解

一、任务的创建与删除 1.任务的基本概念 RTOS系统的核心就是任务管理,FreeRTOS 也不例外,而且大多数学习 RTOS 系统的工程 师或者学生主要就是为了使用 RTOS 的多任务处理功能,初步上手 RTOS 系统首先必须掌握的 也是任务的创建、删除、挂起和恢复等操作,由此可见任务管理…

Tektronix泰克MSO4054混合信号示波器

泰克MSO4054混合信号示波器是一款功能强大的测量仪器&#xff0c;它集成了数字存储示波器和逻辑分析仪的功能&#xff0c;为工程师提供了全面而精确的信号分析解决方案。在今天的高速电子设备开发中&#xff0c;混合信号示波器已经成为不可或缺的工具&#xff0c;而泰克MSO4054…

集中式抄表是什么?什么叫集中式抄表?

1.集中式抄表&#xff1a;简述 集中式抄表是一种现代化、高效率的电力工程、水力发电或燃气计量方法&#xff0c;它改变了传统的人工抄表方式&#xff0c;完成了远程自动化数据收集。这类系统主要由中央服务器、通信系统及安装在用户端智能化表计构成&#xff0c;大大提高了公…

Sarcasm detection论文解析 |CAT-BiGRU

论文地址 论文地址&#xff1a;CAT-BiGRU: Convolution and Attention with Bi-Directional Gated Recurrent Unit for Self-Deprecating Sarcasm Detection | Cognitive Computation github:Ashraf-Kamal/Self-Deprecating-Sarcasm-Detection (github.com) 论文首页 笔记框架 …

液晶数显式液压万能试验机WES-600D技术方案书

一、简介 主机为四立柱、两丝杠、油缸下置式&#xff0c;拉伸空间位于主机的上方&#xff0c;压缩、弯曲试验空间位于主机下横梁和工作台之间。测力仪表采用高清液晶显示屏&#xff0c;实验数据方便直观。 二、 传动系统 下横梁升降采用电机经减速器、链传动机构、丝杠副传动…

全域团购外卖SAAS是什么?能赚钱吗?

最近&#xff0c;很多人都在问与全域团购外卖相关的话题&#xff0c;其中&#xff0c;全域团购外卖SAAS是什么、全域团购外卖SAAS有哪些等问题更是稳居前列。的确&#xff0c;对于没有接触过团购外卖或者其他本地生活服务业务的人来说&#xff0c;全域团购外卖SAAS乍一看确实有…

c3 笔记8 css排版技巧

相关内容&#xff1a;边界、边框、位置&#xff08;absolute、relative、static&#xff09;、overflow、z-index、超链接、鼠标光标特效、…… margin:上边界值 右边界值 下边界值 左边界值 笔记来源&#xff1a; ©《HTML5CSS3JavaScript网页设计》陈婉凌编&#xff…

[力扣]——387.字符串中的第一个唯一字符

. - 力扣&#xff08;LeetCode&#xff09; class Solution {public int firstUniqChar(String s) {int[] count new int[256];// 统计每个字符出现的次数for(int i 0; i < s.length(); i){count[s.charAt(i)];}// 找第一个只出现一次的字符for(int i 0; i < s.lengt…

电脑显示丢失mfc140u.dll怎么修复,总共有7个方法

mfc140u.dll 是一个动态链接库&#xff08;Dynamic Link Library&#xff09;文件&#xff0c;它是Microsoft Foundation Class (MFC)库的一部分&#xff0c;专为使用C编程语言开发Windows应用程序而设计。MFC库由微软提供&#xff0c;作为一个高级的应用程序框架&#xff0c;旨…

耕耘未来——揭秘第一产业的无限潜能

在浩瀚的科技宇宙中&#xff0c;当火星探测器的每一次着陆都能激起全球狂欢&#xff0c;当虚拟现实的浪潮让我们触碰未来&#xff0c;有一个领域&#xff0c;以其恒久不变的坚韧&#xff0c;默默地滋养着人类文明的根脉——这就是第一产业&#xff0c;那片古老而又充满生机的土…

关于YOLO8学习(六)安卓部署ncnn模型--图片检测

前文 关于YOLO8学习(一)环境搭建,官方检测模型部署到手机 关于YOLO8学习(二)数据集收集,处理 关于YOLO8学习(三)训练自定义的数据集 关于YOLO8学习(四)模型转换为ncnn 关于YOLO8学习(五)安卓部署ncnn模型–视频检测 简介 前文第五章,讲述了部署自定义模型后,进…

数字藏品app功能介绍

主要功能介绍 艺术品发售 用户可以在平台上浏览和购买各种艺术品藏品。这些藏品由平台或艺术家发布&#xff0c;并且后台可以设置不同的稀有度&#xff0c;以满足不同用户的需求和收藏喜好。 后台藏品管理 管理员在后台可以灵活地设置藏品的稀有度、价格、数量等信息。不同…

​XMall商城微信小程序前端技术解析

摘要 随着移动互联网的深入发展&#xff0c;微信小程序以其轻量级、便捷性和即用即走的特点&#xff0c;成为了众多企业和开发者关注的焦点。XMall商城微信小程序前端作为一款开源项目&#xff0c;以其精美的页面设计、丰富的功能和高效的性能&#xff0c;受到了广大开发者和用…

恒创科技「5月活动」中国香港/美国服务器配置及价格汇总

值此 5 月&#xff0c;各大云服务商的促销活动也是接连不断。近日&#xff0c;恒创科技上线了 5 月出海乐购“惠”活动&#xff0c;从 4 月 28 日开始&#xff0c;持续整个 5 月份。活动分精选云产品、主流物理服务器、DDoS 防护、免费试用等四大专区&#xff0c;包含几十款企业…

C语言例题37、输入三组数字,按照从小到大的顺序排列输出

#include<stdio.h>int main() {int num[3];printf("请输入3组数字&#xff1a;");for (int i 0; i < 3; i)scanf("%d", &num[i]);for (int i 0; i < 2; i) { //每次选出最小值放在数组前面for (int j i 1; j < 3; j) {if (num[j] …