2011-04-11 92 views
4

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

+3

那么,一方面,运行时为新线程的堆栈空间分配1 MB的内存...... – 2011-04-11 20:01:06

回答

16

一切都是相对的。创建一个新的线程是昂贵的...相对于不创建一个。如果你没有在每个线程上做很多工作,涉及构建和拆除线程的工作可能会占用你CPU时间的一部分。但是相对于创建一个新的进程而言,特别是在Windows上,这是很便宜的。

使用线程池通常更好,因为它被调整为帮助您避免一次激活太多的线程。你很少需要一次激活多个线程,否则你将花费大量的时间在它们之间执行上下文切换。使用线程池可以为您管理这些,因为在工作线程准备就绪之前,其他请求会排队。

+3

如果一个任务需要很长时间才能完成而不会阻塞,那么使用线程池将避免必须分割太多线程中的CPU都想同时运行。但是,如果预计某个任务会阻塞,则应该将其作为单独的线程运行。 – supercat 2011-04-11 20:55:04

4

默认情况下,每个线程获取1 MB的内存分配。这可能很快变得昂贵。

1

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

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

1

线程池不仅是关于分摊线程创建和销毁的成本,而且不仅仅是关于用较少的栈来节省内存。它的真正好处是避免了同时拥有太多活动线程,并且如果运行服务器应用程序,则最小化上下文切换。即使你没有编写服务器应用程序,threadpool只是一个比线程更好的抽象 - 开始异步操作,完成时得到通知,或完成时执行回调,并让OS或运行时找出要创建的线程数。