线程池与线程产生

reo*_*nze 34 multithreading

有人可以列出Thread Spawning与Thread Pooling之间的一些比较点,哪一个更好?请将.NET框架视为支持两者的参考实现.

Han*_*ant 25

线程池线程比常规线程便宜得多,它们汇集了线程所需的系统资源.但它们有许多限制可能使它们不合适:

  • 你不能中止线程池线程
  • 没有简单的方法来检测线程池是否已完成,没有Thread.Join()
  • 没有简单的方法来编组线程池线程中的异常
  • 您不能在消息框之外的线程池线程上显示任何类型的UI
  • 线程池线程的运行时间不应超过几秒钟
  • 线程池线程不应该长时间阻塞

后两个约束是线程池调度程序的副作用,它尝试将活动线程数限制为CPU可用的核心数.如果您安排许多经常阻塞的长时间运行线程,这可能会导致长时间延迟.

许多其他线程池实现具有类似的约束,给予或接受.

  • 这个答案完全取决于语言/平台,但措辞似乎是一般答案.由于OP既未提及平台也未提及语言:-1 (2认同)

jld*_*ont 21

"池"包含准备使用的可用"线程"列表,而"产生"是指实际创建新线程.

"线程池"的用处在于"较低的使用时间":避免了创建时间开销.

在"哪一个更好"方面:它取决于.如果创建时间开销是一个问题,请使用Thread-pooling.在需要执行大量"短期任务"的环境中,这是一个常见问题.


正如其他人所指出的,Thread-Pooling存在"管理开销":如果正确实现,这是最小的.例如,限制池中的线程数是微不足道的.

  • 在 windows xp 操作系统上,与从队列中选择任务并将其分配给池中的线程相比,创建新线程是否有很大差异(在时间消耗方面)? (2认同)
  • 产生一个新的物理线程意味着转换到内核模式并建立一堆mernel结构,因此开销会更高.但是我们都知道你不应该过早地进行优化.如果您只创建一个线程,您将不会注意到开销,如果您创建数千个,您可能会,但即使这可能取决于线程正在进行的工作,这可能会浪费创建线程所需的时间. (2认同)

dan*_*ben 10

对于"更好"的某些定义,您通常希望使用线程池.在不知道您的用例是什么的情况下,请考虑使用线程池,您可以在启动时创建固定数量的线程,也可以按需创建(但线程数不能超过池的大小).如果提交了任务并且没有可用的线程,则将其放入队列,直到有一个线程可以自由处理它.

如果您为响应请求或某种其他类型的触发器而生成线程,则存在耗尽所有资源的风险,因为没有任何内容可以限制创建的线程数量.

线程池的另一个好处是重用 - 一遍又一遍地使用相同的线程来处理不同的任务,而不是每次都必须创建一个新的线程.

正如其他人所指出的,如果你有少量任务会运行很长时间,这将抵消避免频繁创建线程所带来的好处(因为你无论如何都不需要创建大量的线程).

  • 没有理由不能限制生成的线程数量. (2认同)

Wim*_*dse 5

一切都取决于你的情况.创建新线程是资源密集型和昂贵的操作.大多数非常短的异步操作(最多不到几秒)都可以使用线程池.

对于要在后台运行的较长时间运行的操作,通常会创建(生成)自己的线程.(Ab)使用平台/运行时内置线程池进行长时间运行可能会导致令人讨厌的死锁形式等.


dic*_*oce 5

我的感觉是,您应该根据需要创建一个线程...如果性能良好,那么您就完成了.如果在某些时候,您发现在创建线程时需要较低的延迟,通常可以放入线程池而不会破坏任何内容......