这里的一个处理器,应该指的是CPU核,但到底是*4还是*8,也就是他是按物理核心数还是虚拟线程数来算的。。。
还真不知道。个人倾向于物理核心数。
貌似《windows核心编程》上有讲过关于标准的线程池线程的做法,是放CPU核数量*2的那么多的线程,不知道asp.net的threadPool设计成这么多意欲何为呢。
嗯,好问题。
25 * 8
不知道是不是我理解错了
@大芝麻: 你能确定 MSDN 上的那段话是指的 ThreadPool 类的行为吗?
@Launcher: 应该是的呀,因为上面说用这个两个函数查看的。
http://msdn.microsoft.com/zh-cn/library/system.threading.threadpool(VS.80).aspx
@大芝麻: http://www.cnblogs.com/wildman/archive/2008/08/22/1274170.html#commentform
这篇博文后面讲的完成端口测试出可用线程数量也和实际运行的不一样,直接复制的他的代码的
@Launcher: 如果真有那么多可用线程默认等待在那里,岂不是严重影响系统性能
@大芝麻: 你在msdn上切换一下.net的版本,你可以看到解释会有所差异,但是具体来说,线程池的行为是这样的:
1、GetAvailableThreads 是读取的差值,就是 Max - Min 的值;
2、每个可用处理器 250 个辅助线程是 4.0之前的行为,4.0之后改为由"虚拟地址空间的大小等多个因素决定",当然这里的线程数量指代的是 MAX 的值。
3、Available 和 MAX 实际上都指示的队列的大小,实际创建的线程数目不定。MAX 表示队列的上限,Available表示队列的剩余可用数目。
4、线程的创建不是按照请求的任务来,而是综合多方面的因素,按照一定的频率来创建,因此进程通常同时运行的线程数目不会同队列大小相等,你可以通过“资源监视器”来观察实际创建的线程数。
5、辅助线程或工作线程(Worker Thread)是一个简单的数据结构,表示排队的请求,不代表OS的内核线程数目。OS能够同时运行的内核线程数目是每可用处理器 1 个线程,OS为每个进程创建的内核线程数是多少,暂时没有细究,但是必定受到进程堆栈大小的限制。因此你使用 ThreadPool 时,工作线程会先进入队列排队,然后 OS 会分配内核线程来执行,当此内核线程被阻塞时(比如等待其它线程释放资源),那么OS根据一些条件会创建一个新的内核线程来执行请求队列中的下一个请求,或等待一个可用的内核线程被释放。
6、Available 为 0 时表示,队列已满,你的例子里的两个 1023 表示,队列目前还可以继续排入 1023 个请求。
@Launcher: 原来4.0后改变了。还有这个数字是表示可用请求数,不是当前正在等待的线程数量是吧阿。谢谢了。手机上的,不知道怎么搞的最佳答案是那个了。但分没给错。谢谢大侠得细心指导!
“每个可以处理器”是指一个CPU核