TPL如何使用CLR线程池?

14

我目前正在研究任务并行库(Task Parallel Library),看到有人说TPL实际上是使用了CLR级别的线程池机制。但我找不到任何文章证实这一信息。我知道,TPL为每个线程都设置了一个任务队列,并使用某种特殊的工作窃取算法来平衡负载。据我所知,它会为每个处理器创建一个线程。自.NET 4以来,线程池开始使用TPL的任务对象。

我无法理解TPL如何使用线程池。线程池模式说明,工作项被排队,线程池中的可用线程从此队列中获取其中一个。而TPL则将任务存储到各个线程的队列中,如有需要,则使用工作窃取......因此,这两者存在相当大的不同。我的错误在哪里?

额外问题:这是我的第一个Stack Overflow问题,我不确定它是否合适。这样可以吗?


2
(这在 Stack Overflow 上作为一个问题是完全可以的,顺便说一句。) - Jon Skeet
1个回答

10
在TPL中,TaskScheduler负责将任务实际排队执行。Default调度程序将使用线程池 - 但我认为它是新的线程池实现,实际上会做一些巧妙的工作窃取。Daniel Moth有一篇博客文章,其中包含一些您可能会发现有用的细节。

3
这篇文章非常有用,谢谢。我现在明白了自己感到困惑的原因:任务逻辑和工作窃取实际上是 TPL 的一部分设计,但实现方式却在线程池中。这使得线程池演变成了一个“带有工作窃取功能的池子”。再次感谢。 - eks
@jonSkeet,该链接已不再可用。 - Preet Sangha
1
@PreetSangha:这里有三个链接……如果你能说一下哪个是坏的,以及你是否尝试找到了替代品,那会很有帮助。我已经用Wayback Machine版本替换了博客文章链接,但是在未来,请尽量自己改进问题,而不仅仅是报告问题。 - Jon Skeet
@JonSkeet 抱歉 - 你是对的,我应该说清楚是哪一个。 - Preet Sangha

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接