为什么创建新线程昂贵?

时间:2011-04-11 19:58:28

标签: .net multithreading clr threadpool

我读了很多.Net资源告诉我,我应该使用线程池线程,而不是自己实例化一个新线程。他们说你应该这样做,因为实例化一个新线程是一项昂贵的操作。在线程创建过程中会发生什么使它成为一项昂贵的操作?

4 个答案:

答案 0 :(得分:16)

一切都是相对的。创建一个新线程是昂贵的...相对于不创建一个。如果你没有为每个线程做很多工作,那么构建和拆除线程所涉及的工作可能会构成你可测量的cpu时间的一部分。但相对于创建新流程而言,它相对便宜,特别是在Windows上。

使用线程池通常也更好,因为它经过调整可以帮助您避免同时激活太多线程。您很少想要一次激活多个线程,或者您将花费大量的CPU时间在它们之间执行上下文切换。使用线程池为您管理这个,因为其他请求排队,直到工作线程准备好。

答案 1 :(得分:4)

默认情况下,每个线程都会分配1 MB的内存。这很快就会变得昂贵。

答案 2 :(得分:1)

有几个因素。已经提到过的是堆栈的内存。因为堆栈内存不是由用于对象的普通GC分配器处理的,所以创建线程堆栈然后放弃它与创建一堆价值的堆对象并放弃它们是截然不同的。

尚未提及的另一个因素是与线性静态变量相关的成本。在某些需要所有线程静态变量的系统中,线程可能会在线程启动之前定义,启动新线程需要初始化所有线程静态变量。因为.net允许线程动态添加线程静态变量,所以使用的数据结构是不同的。尽管如此,在线程启动时初始化此类数据结构并不是免费的。

答案 3 :(得分:1)

Threadpool不仅仅是分摊线程创建和销毁的成本,而且不仅仅是用较少的堆栈来节省内存。它的真正好处是避免同时拥有太多活动线程,并在运行服务器应用程序时最小化上下文切换。即使您没有编写服务器应用程序,线程池也只是比线程更好的抽象 - 启动异步操作,完成时获取通知,或者在完成时执行回调,并让操作系统或运行时计算出要创建的线程数。