首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

问个线程创建的的有关问题,创建不到2000个线程就报错了

2013-04-12 
问个线程创建的的问题,创建不到2000个线程就报错了想创建2000个线程 看看有什么问题,dic 是可以查看总的创

问个线程创建的的问题,创建不到2000个线程就报错了



想创建2000个线程 看看有什么问题,  dic 是可以查看总的创建之后线程的个数,但是在创建第1300多报错了。
上限可以创建多少个线程啊




[解决办法]
异常信息告诉你,内存不足了,和死循环无关,一个线程如果占用5M内存,1000个线程就要5G内存。你电脑倒底有多大内存?


这是典型的多线程滥用,一般线程数最大不能超过处理器数量的25倍,否则就必须排队等待。
看下ThreadPool的默认设置

引用
每个进程都有一个线程池。线程池的默认大小为:每个可用处理器 25 个辅助线程,再加上 1000 个 I/O 完成线程。使用 SetMaxThreads 方法可以更改线程池中的线程数。每个线程使用默认的堆栈大小并按照默认的优先级运行。

即使是服务器并发连接的情况,也有并发上限的限制,达到了上限就必须排队等待,根本就没有开启上千线程并发处理的可能性。
[解决办法]
额,2000个线程??夸张点

普通台式机能同时跑200个线程就已经很厉害了。看看迅雷,QQ大多都把自己的线程控制在20个以内,原来曾经出过破解迅雷,快车的线程到100个的破解补丁,你要用用看就知道效果了,你的机器迅速就卡死了

所以你呢,你这里应该使用线程池,而不是直接同时2000个线程
[解决办法]
1个thread似乎默认消耗1mb,你的内存耗完了自然异常。

ThreadPool默认最多启动250个thread(通过SetMaxThreads方法可修改),超过的thread将排队等待。
另外ThreadPool可以设定需要维护的最小thread数,可以提高thread创建的速度(推荐10以下)。

搂主需要2000 thread同时,还是加内存吧。
一般的项目还是ThreadPool吧,不容易崩,而且都后台处理了,耗时长点也没关系的。
[解决办法]
引用:
我电脑8G的  CUP 是4核
我看我的任务管理器   还有30%多没有占用啊。已使用了70%左右的内存。
任务管理器显示这个EXE才占用了 340,XXXK。 具体大概也就340多M。

很多因素会影响程序可申请到的内存,比如内存碎片、系统缓存,如果程序无法向操作系统申请到可用内存,即使你系统还有内存也没用。
[解决办法]
还有一点,你那个程序如果运行在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多个线程时挂掉。

热点排行