Welcome

首页 / 软件开发 / .NET编程技术 / CLR全面透彻解析:CLR中的线程管理

CLR全面透彻解析:CLR中的线程管理2011-10-30 msdn Erika Fuentes本专栏基于 CLR 线程系统和任务并行库的预发布版本撰写而成。所有信息均有可能发生变更。

当前进行的从单核体系结构到多核体系结构的技术变革带来了诸多好处。举例来说,在线程环境中, 如果有效使用多个线程,便可通过使用多个核和并行性提高性能,例如,使用多线程对数据库进行多个独 立查询的 ASP.NET 应用程序。

但是,使用多个核会带来一些新的问题。您可能会看到编程和同步模型变得更加复杂,您需要控制并 发,而要调整和优化性能将会更加困难。此外,对于影响并发应用程序性能和行为的许多新因素,我们还 不是很了解。因此,优化性能变得富有挑战性,尤其是在优化目标不是某一特定应用程序,而是面向所有 应用程序时。

CLR 中的线程是并发环境的一个示例,其中许多因素(如多核体系结构引入的因素)都可能影响并发 的行为和性能。锁争用、缓存争用以及过度上下文切换只是这些因素中的一部分。目前在 CLR ThreadPool 方面进行的工作旨在通过将并行框架集成到运行时并在内部处理一些最常见的问题,使开发 人员可以更轻松地利用并发性和并行性来获得更高的并发级别和更好的性能。

在本专栏中,我们将介绍在优化多线程托管代码(尤其是位于多处理器硬件中的托管代码)过程中开 发人员遇到的一些常见问题和需要注意的重要因素,我们还将介绍 ThreadPool 的未来更改将如何解决上 述问题,以及帮助减轻编程人员的工作负担;此外,我们还将讨论并发控制的一些重要方面,以帮助您了 解应用程序在高度多线程化的环境中的行为。我们在介绍以下内容时假设您熟悉 CLR 中的并发、同步和 线程的基本概念。

并发的常见问题

大多数软件在设计上都适合单线程执行。其部分原因是,单线程执行的编程模型可降低复杂性,并且 比较容易编码。现有的单线程应用程序对多核化境的适应能力极差,不能使用多个核。更糟糕的是,要使 单线程模型适应多核环境也不很一件简单的事情,其中许多原因是可预测的,如锁争用和资源争用、争用 条件和资源缺乏等同步问题。其他原因目前还不是很清楚。例如,如何确定特定类型(和大小)的工作负 荷在任意给定时间的最佳并发级别(线程数)?

想一下设计为在单核计算机上运行的 CLR 中的线程系统:任务(工作项)逐个排队,形成一个列表, 该列表受一个锁保护。然后,每个线程按顺序占用队列中的项目。当将该线程系统迁移到多核体系结构时 ,如果锁上存在大量对更高并发级别的争用时,其性能就会降低。有趣的是,Kenny Kerr 在 2008 年 10 月在“借助 C++ 进行 Windows 开发”专栏中曾发表过“探索高性能算法”一文,其中他说道“单处理器 上设计良好的算法通常可以胜过多处理器上的低效实现”,这句话表明了仅添加更多的处理器并不总能改 善性能。

在本文的后部分内容中,我们将现有的线程系统统称为 ThreadPool,将工作项的概念统称为任务队列 中的项(如 QueueUserWorkItem)。在单核计算机中,通过在线程之间分配处理器的时间,可按照详细的 任务计划管理并发操作。既然存在多个核,您还必须考虑如何在核之间公平地分配工作、考虑基础内存层 次结构以确保正确性和性能,以及决定如何控制和利用更高的并发级别。