【发布时间】:2011-09-12 10:40:59
【问题描述】:
在this C# 线程网络教程中,Joseph Albahari 写道:“不要在池线程中睡觉!”为什么不应该这样做?它对性能的影响有多严重? (不是我想做,只是好奇。)
【问题讨论】:
标签: c# multithreading threadpool sleep
在this C# 线程网络教程中,Joseph Albahari 写道:“不要在池线程中睡觉!”为什么不应该这样做?它对性能的影响有多严重? (不是我想做,只是好奇。)
【问题讨论】:
标签: c# multithreading threadpool sleep
线程是一个重量级的对象。
创建一个新线程需要大量资源,例如为托管堆栈分配 1 MB、创建托管线程对象、内核堆栈、内核线程对象、用户线程环境块。这一切都需要时间和记忆。因此,您不想真正快速地创建和销毁对象。此外,一旦你有多个线程,上下文切换也会占用一些资源
线程池是 CLR 可以放置未使用的线程的地方,以防您的应用程序需要它。
线程池最初包含 0 个线程,一旦您从池中请求线程,池将快速创建为池定义的最小线程数。大约 2 分钟后,未使用的线程被杀死。但是如果负载增加并且您需要更多线程,线程池将慢慢创建新线程,直到达到最大界限。您的线程数不能超过最大值,一旦工作线程返回池,所有新请求都将排队并执行。在更糟糕的情况下,您可以获得 OutOfMemoryException
如果从池中取出的线程被阻塞,它:
【讨论】:
线程池旨在快速在不同线程上执行相对较短的任务,而无需花费创建新线程的成本。线程池有一个最大线程数,一旦达到,任务就会排队,直到有线程可用。
因此,在线程池中休眠的线程会阻塞队列,或导致线程池耗尽。
【讨论】:
线程池中只有有限数量的线程;线程池旨在高效执行大量短任务。它们依赖于每个任务快速完成,以便线程可以返回到池中并用于下一个任务。
因此,在线程池中休眠的线程会耗尽池,最终可能会耗尽可用线程,并且无法处理您分配给它的任务。
【讨论】: