2011-06-10 44 views
13

this关于C#线程的Web教程,Joseph Albahari写道:“不要在混合线程中睡觉!你为什么不这样做?它会对性能产生多大的影响? (这不是我想要做的,我只是好奇而已。)沉睡在C#线程池中

回答

5

线是一个重量级的物体。
创建新线程需要大量资源,例如为托管堆栈分配1 MB,创建托管线程对象,内核堆栈,内核线程对象,用户线程环境块。这都需要时间和记忆。因此,您不想快速创建和销毁对象。此外,一旦有多个线程切换,还需要一些资源

线程池是CLR可以放置未使用线程的地方,以防您的应用程序需要它。
线程池最初包含0个线程,一旦您从池中请求一个线程,该池将快速创建为该池定义的最小线程数。大约2分钟后,未使用的线程被杀死。但是,如果负载增加并且需要更多线程,则线程池将缓慢创建新线程,直到达到最大限制。您不能拥有比最大值更多的线程,一旦工作线程返回到池中,所有新请求都将排队并执行。在最坏情况下,你可以得到OutOfMemoryException异常

如果从池中取出一个线程被阻塞,它:

  • 占有的资源
  • 没有做任何有价值的工作,当一个应用程序可能需要该线程的新请求
  • 休息的可扩展性通过引入块
13

线程池中只有有限的线程数量;线程池被设计为高效地执行大量的任务。他们依靠每个任务快速完成,以便线程可以返回到池并用于下一个任务。

因此,在一个线程池线程中休眠会使池停止运行,最终可能会耗尽可用线程,并且无法处理分配给它的任务。

6

线程池旨在快速在不同线程上执行相对较短的任务,而无需花费创建新线程的开销。线程池拥有最大数量的线程,一旦达到,任务就会排队等待线程变为可用状态。

在线程池中休眠的线程因此会占据队列或导致线程池耗尽。

+0

你的第一线似乎被什么你休息相矛盾说。当然,阻止队列或线程耗尽是一个直接的性能下降? – Chris 2011-06-10 11:47:37

+0

我的意思是睡在泳池线程不会降低该线程的性能。这个说法有点糟糕,我同意。我已将其删除。 – Sven 2011-06-10 11:52:23

+0

啊,是的,我明白你的意思了。它不会降低一个线程的性能,但会降低使用该池的整个过程的性能。这确实有道理。 :) – Chris 2011-06-10 13:52:14