问个线程创建的的问题,创建不到2000个线程就报错了想创建2000个线程 看看有什么问题,dic 是可以查看总的创
问个线程创建的的问题,创建不到2000个线程就报错了
想创建2000个线程 看看有什么问题, dic 是可以查看总的创建之后线程的个数,但是在创建第1300多报错了。
上限可以创建多少个线程啊
[解决办法]异常信息告诉你,内存不足了,和死循环无关,一个线程如果占用5M内存,1000个线程就要5G内存。你电脑倒底有多大内存?
这是典型的多线程滥用,一般线程数最大不能超过处理器数量的25倍,否则就必须排队等待。
看下ThreadPool的默认设置
即使是服务器并发连接的情况,也有并发上限的限制,达到了上限就必须排队等待,根本就没有开启上千线程并发处理的可能性。
[解决办法]额,2000个线程??夸张点
普通台式机能同时跑200个线程就已经很厉害了。看看迅雷,QQ大多都把自己的线程控制在20个以内,原来曾经出过破解迅雷,快车的线程到100个的破解补丁,你要用用看就知道效果了,你的机器迅速就卡死了
所以你呢,你这里应该使用线程池,而不是直接同时2000个线程
[解决办法]1个thread似乎默认消耗1mb,你的内存耗完了自然异常。
ThreadPool默认最多启动250个thread(通过SetMaxThreads方法可修改),超过的thread将排队等待。
另外ThreadPool可以设定需要维护的最小thread数,可以提高thread创建的速度(推荐10以下)。
搂主需要2000 thread同时,还是加内存吧。
一般的项目还是ThreadPool吧,不容易崩,而且都后台处理了,耗时长点也没关系的。
[解决办法]很多因素会影响程序可申请到的内存,比如内存碎片、系统缓存,如果程序无法向操作系统申请到可用内存,即使你系统还有内存也没用。
[解决办法]还有一点,你那个程序如果运行在32位下面,那么还受到32位程序最大内存使用的限制。
[解决办法]1、默认情况下,每个thread的stack会占用1MB的内存,你2000个,就是2G内存。
2、如果是32bit模式运行,那么受制于2G每应用的限制
3、如果是64bit模式,和你当前的可用内存有关系(一般来讲,可用物理内存+未使用的page file大小)
4、如果是asp.net代码,受制于machine.config中的memory limit限制(默认60%)。如果是32bit,那么一般也就用到1.2G左右。
5、如果是上面4讲的,那么你同样的代码,放到命令行程序去跑,一般会到1900多个线程时挂掉。