作死小实验:Windows 下可创建的线程数目

“Windows 操作系统最多可创建多少线程呢?和内存大小有什么关系呢?”
上高操课的时候老师随便提了那么一句,感觉很好玩的样子。我又懒得装虚拟机了,于是直接作死在本机测试一下。不多说,直接上代码:

#include 
#include 

static int runFlag = TRUE;

DWORD WINAPI threadWork(LPVOID threadNo)
{
    DWORD result = 0;
    while(runFlag)
    {
    	//采用休眠的方式代替死循环,避免系统崩溃
        Sleep(100000);
    }
    //Terminate
    return result;
}

int main(int argc, char* argv[])
{
    int count = 0;
    DWORD targetThreadID;
    while(runFlag)
    {
        if(CreateThread(NULL, 0, threadWork, NULL, 0, &targetThreadID) == NULL)
        {
            runFlag = false;
            break;
        }
        else
            count++;
        printf("%d ", count);
    }
    Sleep(5000);
    printf("max threads num:%d\n", count);
    printf("Program ends successfully\n");
}

结果第一次运行结果超过 40 万还是没停下来,考虑到运行时间超过 100 秒,原先沉睡的线程已经被唤醒并销毁,因此这个程序可能永远都停不下来了……
于是修改了参数,使得每个线程休眠的时间增加到 1000 秒,再次尝试。最终的结果如下:
线程测试运行结果
可以看到创建线程上限约为 322751。
夏姬八分析:

  • 考虑这台 PC (Windows 10 64 位)的内存为 16 GB,平均每个线程占用内存约为 52 KB。
  • 换用 32 位 Windows XP ,测得 256 MB 内存可创建最大线程为约 2030 个,平均每个线程占用内存约为 129 KB。

后者的数据似乎更接近整数,但是我并不清楚缘由。如果你也喜欢各种作死尝试,也欢迎来做做这个实验吧~

你可能感兴趣的:(作死小实验:Windows 下可创建的线程数目)