首页 / 软件开发 / .NET编程技术 / 并发 - CLR 4.0 ThreadPool中的并发限制
并发 - CLR 4.0 ThreadPool中的并发限制2010-11-18 MSDN Erika Fuentes自 CLR 2.0 后,最新版本 (CLR 4.0) 中的 CLR ThreadPool 已经过多次重大 更改。 最近的技术趋势转变(例如广泛应用多核体系结构以及由此产生的并行化 现有应用程序或编写新并行代码的需求)已成为 CLR ThreadPool 改进中最重要 的决定性因素之一。在 MSDN 杂志 2008 年 12 月刊的 CLR 全面透析专栏“CLR 中的线程管理” (msdn.microsoft.com/magazine/dd252943) 中,我介绍了一些动机和相关问题, 例如并发控制和干扰信息。现在,我将介绍 CLR 4.0 ThreadPool 中解决这些问题的方式、相关的实现选 项以及这些选项对其行为的影响。同时,我还将重点介绍当前 CLR 4.0 ThreadPool(为了方便起见,下文简称 ThreadPool)中实现自动化并发控制的方法。我还将简要地概述 ThreadPool 体系结构。本文中介绍的实现细节在未来版本中有可能发生变更。不过,对于设计和编写新并发应用程序的读者而言,如果他们正在致力于利用 并发技术改进旧应用程序,或者使用 ASP.NET 或并行扩展技术(所有这些都在 CLR 4.0 上下文中实现),他们会发现本文对于理解和利用当前 ThreadPool 行 为非常有用。ThreadPool 概述 线程池用来提供重要服务,例如线程管理、不同类型的并发 的抽象性以及并发操作的限制。通过提供这些服务,线程池可以减轻用户的负担,使他们无需手动执行这些操 作。对于无经验的用户而言,线程池是非常方便的,他们不需要学习和掌握多线程 环境的细节。对于经验丰富的用户而言,拥有可靠的线程系统就意味着用户可以将精力集中 在改进应用程序的各种功能上。ThreadPool 为托管应用程序提供这些服务,并且提供跨平台可移植性支持( 例如,在 Mac OS 上运行特定 Microsoft .NET Framework 应用程序的平台)。有各种不同类型的并发可以与系统的不同部分相关。 最相关的部分包括:CPU 并行性、I/O 并行性、计时器和同步、负载平衡和资源利用率。我们可以针对并发的不同方面,简要地概述 ThreadPool 的体系结构。有关 ThreadPool 体系结构和相关 API 使用的详细信息,请参阅“CLR 的线程池” (msdn.microsoft.com/magazine/cc164139)。尤其值得一提的是,有两种独立的 ThreadPool 实现:一种用来处理 CPU 并 行性,称为工作线程 ThreadPool;另一种用来处理 I/O 并行性,称为 I/O ThreadPool。下一部分将重点介绍 CPU 并行性和 ThreadPool 中的相关实现工作,特别是 关于并发限制的策略。工作线程 ThreadPool:旨在提供 CPU 并行性级别的服务,它利用多核体系结 构。CPU 并行性有两个主要的考虑因素:以优化的方式快速调度工作;以及限制并 行度。 对于前者,ThreadPool 实现利用无锁定队列这样的策略来避免争用和工 作窃取,以便实现负载平衡,这些领域超出了本文的讨论范围(要进一步了解这 些主题,请参阅 msdn.microsoft.com/magazine/cc163340)。后者(即并行度限制)使并行度控制可以防止由于资源争用而导致总体吞吐量 下降。 CPU 并行性处理起来非常棘手,因为它涉及到许多参数,例如确定在任意 给定时间有多少工作项可以同时运行。另外一些问题是内核数以及如何针对不同类型的工作负载进行优化。例如,理论上每个 CPU 一个线程是最优的,但如果工作负载经常发生阻塞, 就会浪费 CPU 时间,因为其他线程可以使用这些资源来执行更多工作。