线程池是否会创建超过{num of cores}线程的纯粹异步"程序?

时间:2015-09-06 08:13:11

标签: .net multithreading asynchronous task-parallel-library threadpool

考虑理论上的纯粹异步" .NET程序(Web服务器,就此而言) - 没有线程被阻止,所有I / O都是完全异步的。现在,假设该服务器负载很重,请求(任务)的排队速度比排队的速度快(由于I / O延迟)。显然,在这种情况下,超过num_of_cores线程不会提高吞吐量 - 服务器只是在它的限制。但是,ThreadPool会识别这个事实,还是会尝试创建越来越多的线程来减轻Tasks缓冲区的压力?

* num_of_cores是指操作系统看到的逻辑核心数。

1 个答案:

答案 0 :(得分:1)

  

但是,ThreadPool会识别这个事实还是会尝试创建   越来越多的线程来减少Tasks缓冲区的压力?

CLR线程池不知道底层操作系统可以处理的IO请求数据包(IRQ)的实际数量。它有一个人工限制,它在线程池的VM实现中设置:

SVAL_IMPL_INIT(LONG,ThreadpoolMgr,MaxLimitTotalCPThreads,1000); 

您可以通过调用ThreadPool.SetMaxThreads来改变该值。执行此操作时,VM会执行此操作:

MaxLimitTotalCPThreads = 
        min(MaxIOCompletionThreads, (DWORD)ThreadCounter::MaxPossibleCount);

ThreadCounter::MaxPossibleCount等于0x7FFF(524287)完成端口线程。

线程池尝试从您那里抽象出这些操作,这是您不应该非常担心的事情。让线程池为您平衡工作,根据需要分配和销毁线程。在最糟糕的情况下,您将开始注意与IO操作相关的延迟,但我非常确定您需要花费一些精力来实际达到上限。

通常,如果您对本机实施感兴趣,可以browse it on GitHub