`

NET 4.0 多任务编程 之三 改进的线程池

阅读更多
其实从.NET设计之初中就有并行编程技术的一些实现---多线程技术。多线程最大的问题就是难于使用和管理。因为它的复杂性,往往使用我们把注意力分散在如何管理多线程上,而致使我们的最初目的被淡化了。

在.NET 4 中就引入了“并行编程”来简化并行计算,虽然.NET 4.0中提出的并行编程的底层机制其实还是基于多线程的。但是他们之前最大的区别就是.NET 4.0中的并行编程更加方便和直观。

平行任务库(Task Parallel Library, 简称TPL)成为.NET 4.0各种新特性中最为闪耀的明星; 这个新特性的核心是Task, 底层支持就是.NET 4.0 线程池的重新实现.

我们知道,线程池基本功能包括:管理工作队列和管理执行这些工作的线程集。相应的,设计线程池需要考量的是:一、如何让工作快速进出队列,二、如何运用算法优化服务队伍的线程数目。下面我们着重比较下新旧线程池在这方面的不同。

关于进列和出列方面,原先的线程池提供了最简单的工作线程接口QueueUserWorkItem,简称QUWI。QUWI的使用很简单,通过QueueUserWorkItem这个方法,把一个委托放入队列等这稍后被执行:
    static void CreateAndWaitForWorkItems(int numWorkItems)
    {
        using (ManualResetEvent mre = new ManualResetEvent(false))
        {
            int itemsRemaining = numWorkItems;
            for (int i = 0; i < numWorkItems; i++)
            {

                ThreadPool.QueueUserWorkItem(()=>
                {
                    if (Interlocked.Decrement(ref itemsRemaining) == 0) mre.Set();

                });
            }
            mre.WaitOne();
        }


可以看出,原有的线程池存在着局限性题:
QUWI基本上对每个工作单元的一无所知,仅限于了解它的存在。这对工作单元的执行是重要的制约。比如,线程池不知道是否工程单元是否彼此相关,所以它必须假设他们都是完全独立的,线程池应用程序接口不提供任何辅助手段处理各个工作项之间的关系。 这样的限制带来的明显问题: 这就意味着我们不能重新安排工作,以优化执行,为了确保公平,独立工作单元通常按照FIFO的顺序执行。

由于线程池不提供处理关系的应用程序接口, 当多个工作项之间确实存在需要处理的关系时, 开发人员只能在工作项执行体中加入同步代码才能达到这一目的,导致程序的可读性下降, 当大量这样的代码出现时, 系统的可维护性和质量就受到威胁。同时,开发方式也受到影响. 由于API的这种限制, 开发人员更倾向于将"发射后不管"的任务放到线程池中执行, 而对于有同步或次序要求的任务, 更倾向于在独立的线程中执行。
分享到:
评论

相关推荐

    异步/多线程/任务/并行编程之一:如何选择合适的多线程模型?

    异步、多线程、任务、并行编程之一:选择合适的多线程模型 本篇概述: @FCL4.0中已经存在的线程模型,以及它们之间异同点; @多线程编程模型的选择。  1:异步、多线程、任务、并行的本质 这四个概念对应在CLR中的...

    CLR.via.C#.(中文第3版)(自制详细书签)Part1

    · 使用线程池、任务、取消、计时器和异步I/O操作来设计响应性强、稳定性高和伸缩性大的解决方案 · 借助于异常处理来进行状态管理 · 使用CLR寄宿、AppDomain、程序集加载、反射和C#的dynamic类型来构造具有动态...

    CLR.via.C#.(中文第3版)(自制详细书签)

    本书作者作者Jeffrey Richter,.NET和Windows编程领域当之无愧的大师和权威,以著述清楚明了,行文流水,言简意赅著称,在国内具有相当高的知名度,他的著作之一《Windows核心编程(第5版)》屡获殊荣,在国内外都...

    CLR.via.C#.(中文第3版)(自制详细书签)Part3

    · 使用线程池、任务、取消、计时器和异步I/O操作来设计响应性强、稳定性高和伸缩性大的解决方案 · 借助于异常处理来进行状态管理 · 使用CLR寄宿、AppDomain、程序集加载、反射和C#的dynamic类型来构造具有动态...

    CLR.via.C#.(中文第3版)(自制详细书签)Part2

    · 使用线程池、任务、取消、计时器和异步I/O操作来设计响应性强、稳定性高和伸缩性大的解决方案 · 借助于异常处理来进行状态管理 · 使用CLR寄宿、AppDomain、程序集加载、反射和C#的dynamic类型来构造具有动态...

    Java SE实践教程 pdf格式电子书 下载(一) 更新

    Java SE实践教程 pdf格式电子书 下载(三) 更新 http://download.csdn.net/source/2824042 Java SE实践教程 pdf格式电子书 下载(四) 更新 http://download.csdn.net/source/2824046 内容简介:此书结合具体实例...

    Java SE实践教程 pdf格式电子书 下载(四) 更新

    Java SE实践教程 pdf格式电子书 下载(三) 更新 http://download.csdn.net/source/2824042 Java SE实践教程 pdf格式电子书 下载(四) 更新 http://download.csdn.net/source/2824046 内容简介:此书结合具体实例...

    vc++ 应用源码包_6

    多任务多线程断点续传DLL 多线程文件下载 多线程查找文件(功能增强版) 自定义了一个文件搜索类。多线程实现。 多线程高速文件搜索程序源码 VC++视频聊天系统源代码 实例简单,有用户登录、传输文件、视频、画质...

    vc++ 应用源码包_5

    多任务多线程断点续传DLL 多线程文件下载 多线程查找文件(功能增强版) 自定义了一个文件搜索类。多线程实现。 多线程高速文件搜索程序源码 VC++视频聊天系统源代码 实例简单,有用户登录、传输文件、视频、画质...

    vc++ 应用源码包_3

    多任务多线程断点续传DLL 多线程文件下载 多线程查找文件(功能增强版) 自定义了一个文件搜索类。多线程实现。 多线程高速文件搜索程序源码 VC++视频聊天系统源代码 实例简单,有用户登录、传输文件、视频、画质...

    vc++ 应用源码包_1

    多任务多线程断点续传DLL 多线程文件下载 多线程查找文件(功能增强版) 自定义了一个文件搜索类。多线程实现。 多线程高速文件搜索程序源码 VC++视频聊天系统源代码 实例简单,有用户登录、传输文件、视频、画质...

    vc++ 应用源码包_2

    多任务多线程断点续传DLL 多线程文件下载 多线程查找文件(功能增强版) 自定义了一个文件搜索类。多线程实现。 多线程高速文件搜索程序源码 VC++视频聊天系统源代码 实例简单,有用户登录、传输文件、视频、画质...

    Java SE实践教程 源代码 下载

    第3章 当一个变成多个——集合框架的基本概念 53 .3.1 讲解 54 3.1.1 集合概述 54 3.1.2 Collection接口 54 3.1.3 泛型(Generics) 56 3.1.4 Map接口 57 3.2 练习 59 3.2.1 创建课程管理系统 59 3.3 小结 ...

    Visual C#2010 从入门到精通(Visual.C#.2010.Step.By.Step).完整去密码锁定版 I部分

    27.1 为何使用并行处理来执行多任务处理 550 27.2 在桌面应用程序中实现多任务处理 551 27.2.1 任务、线程和线程池 552 27.2.2 创建、运行和控制任务 553 27.2.3 使用task类实现并行处理 557 27.2.4 使用...

    C#5.0本质论第四版(因文件较大传的是百度网盘地址)

    18.2.5 线程池处理 516 18.3 异步任务 517 18.3.1 从Thread到Task 518 18.3.2 理解异步任务 518 18.3.3 任务延续 521 18.3.4 用AggregateException处理Task上的未处理异常 525 18.4 取消...

    vc++ 开发实例源码包

    该实例可进行局域网的聊天、一对多、多对一、和多对多的传送和续传,理论上这是我本人的实现目的,而且目前经测试已基本实现了上述功能,而且网速一般有几M/S。另外有只打开一个应用程序、CRichEdit的使用、最小到...

Global site tag (gtag.js) - Google Analytics