c - 下面的代码创建的线程数是多少,为什么?
问题描述
我认为该函数将创建线程,直到资源耗尽,但我运行代码并没有看到资源耗尽..
DWORD WINAPI CreateThreads(LPVOID param)
{
int n = *(int*)param;
HANDLE* threads = (HANDLE*)malloc(n * sizeof(HANDLE));
for (int i = 0; i < n; i++)
{
threads[i] = CreateThread(NULL,0, CreateThreads, &n, 0,NULL);
}
for (int i = 0; i < n; i++)
{
WaitForSingleObject(threads[i], INFINITE);
}
return 0;
}
int main()
{
int n = 5;
CreateThreads(&n);
return 0;
}
解决方案
Windows 保护自己免受这种类型的耗尽。CreateThread
一旦达到每个进程允许的最大线程数,就会失败(对于我有幸开发的 Windows 系统,通常大约有 2000 个线程)
您可能期望首先耗尽某些资源,但是线程需要的资源很多,而第一个耗尽自身的资源会导致后续调用CreateThread
失败。根据我的经验,主要消耗的两个资源是虚拟内存,因为每个新线程都需要堆栈,以及内核可以在调度程序中容纳的线程数量的限制(上下文切换机制)。
推荐阅读
- reactjs - 多个 ReactDOM.render 函数?
- php - WordPress 用户功能创建成功,但未发送“SB 欢迎电子邮件”
- tensorflow - 尝试在 TPU 上运行 effecientNet
- typescript - 模块 '"./config"' 没有导出的成员 'app_name'
- sql - 如何使用带有 Case 语句的 MIN/MAX 函数来更改值以删除 Null?
- javascript - 用于字符串操作的 ng-Mask
- javascript - 如何重置 webpush 权限
- java - ProGuard - 无法在发布模式下编译
- java - 如何循环编写器.csv?
- jira - 如何配置 jira Webhook 以访问 HTTPS URL