`

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的这种限制, 开发人员更倾向于将"发射后不管"的任务放到线程池中执行, 而对于有同步或次序要求的任务, 更倾向于在独立的线程中执行。
分享到:
评论

相关推荐

    Android4.0网络编程详解.pdf

    - Google推荐使用异步任务(AsyncTask)或其他并发解决方案,如线程(Thread)和线程池(ThreadPoolExecutor)来处理网络请求。 10. 运行时权限: - 在Android 6.0(Marshmallow)以后的版本中,网络访问权限变成...

    NET4.0并行计算技术基础

    .NET Framework 4.0改进了线程池,使其能更好地适应并行计算需求。线程池管理线程的创建和销毁,降低了上下文切换的开销。任务调度器(TaskScheduler)负责决定何时何地执行任务,优化线程的使用,确保并行任务的...

    xianchengchi.rar_C# 线程_C#线程池_CSharp 多线程_c#多线程_c# 多线程

    在C#编程中,线程和线程池是并发处理的核心概念,特别是在处理大量异步任务或需要同时执行多个操作的场景下。本资源“xianchengchi.rar”提供了关于C#线程池的演示程序,帮助开发者深入理解并应用线程池技术。 线程...

    多线程线程池使用 (C#3.5) 高效

    - 使用`Task`和`Parallel`类:C# 4.0引入的`Task`和`Parallel`类提供了更高级别的并行编程模型,可以更好地利用线程池。 6. **FThreadTest示例** `FThreadTest`可能是测试线程池功能的代码文件,可能包含对线程池...

    C# 线程池的使用 高级应用

    线程池通过复用已经创建的线程来避免频繁地创建和销毁线程带来的开销,是多任务并行处理的最佳实践之一。本教程将深入探讨C#线程池的高级应用,特别适用于使用VS2005开发环境的开发者。 首先,我们需要了解线程池的...

    c#线程池相关.zip

    5. `Task`和`Task&lt;T&gt;`: .NET 4.0引入了并行扩展库(TPL),`Task`和`Task&lt;T&gt;`提供更高级的异步编程模型,虽然它们不直接与线程池关联,但内部会使用线程池来执行任务。 线程池的优缺点: 优点: - 资源管理:线程池能...

    C#开发的线程池和管理器

    除了`ThreadPool.QueueUserWorkItem`方法,C# 4.0引入了`Task`类,它是异步编程的新模型,也与线程池紧密相关。`Task`提供了更高级别的抽象,可以更好地控制任务的执行,如并行处理、取消任务、异常处理等。`Task....

    c#线程池详解

    通过`Task.Run`方法,开发者可以轻松地将任务提交到线程池,简化了多线程编程。 五、最佳实践 1. **短生命周期任务**:线程池最适合处理那些执行时间短、数量众多的任务,如网络I/O、数据库查询等。 2. **避免长...

    OpenMP 4.0 手册

    OpenMP(Open Multi-Processing)是一种应用编程接口(API),用于在共享内存并行计算机上进行多线程编程。OpenMP 4.0是该标准的一个版本,它引入了新的特性,增强了对现代多核处理器的支持,提高了并行计算的效率和...

    微软的线程池API ThreadPool

    线程池API是微软.NET Framework中的一个重要组成部分,它在`System.Threading`命名空间下提供了一系列高效、可管理的多线程编程接口。线程池的主要目的是优化系统资源的使用,减少线程创建和销毁的开销,提高系统的...

    C#多线程编程实战Code源代码

    在C#编程中,多线程技术是一种关键的并发处理机制,它允许程序同时执行多个独立的任务,从而提高系统的效率和响应性。本资源“C#多线程编程实战Code源代码”来源于华章出版社,提供了丰富的实例来帮助开发者深入理解...

    .NET多线程编程教程,_NET多线程编程实例

    本教程将深入探讨.NET多线程编程的核心概念、关键技术和最佳实践。 一、线程基础 1.1 线程定义:线程是程序执行的最小单元,每个线程代表了程序中的一个独立控制流,可以并发执行任务。 1.2 线程类型:主线程、工作...

    c#多线程编程实战(原书第二版)源码

    《C#多线程编程实战(原书第二版)源码》是一本深入探讨C#中多线程技术的专业书籍,其源码提供了丰富的实践示例,帮助读者掌握并发编程的核心概念和技术。在C#中,多线程是实现高性能、响应式应用程序的关键组成部分...

    C#多线程编程实战完整源码

    C#多线程编程是开发高效、响应迅速的软件应用的关键技术之一,尤其在现代计算环境中,多核处理器和并发处理的需求日益增加。本资源"《C#多线程编程实战》完整源码"提供了丰富的实例,适用于学习和实践C#中的多线程...

    基于任务异步编程

    **基于任务的异步编程**是一种在现代编程中广泛采用的技术,特别是在高性能和高并发的应用场景下。异步编程的核心思想是允许程序在等待某个耗时操作完成时,不阻塞主线程,而是去执行其他任务,从而提高系统资源的...

    C#多线程开发之并发编程经典实例.zip

    本资源“C#多线程开发之并发编程经典实例”提供了丰富的实例,旨在帮助C#开发者深入理解并掌握多线程技术。以下是关于C#多线程和并发编程的一些关键知识点: 1. **线程基础**:线程是操作系统分配CPU时间的基本单位...

    .NET 4.0并行编程简介

    .NET 4.0引入了一组强大的并行编程工具和库,极大地增强了开发人员在多核处理器环境下编写高效、可扩展代码的能力。这个平台的核心是任务并行库(Task Parallel Library, TPL),它提供了一个直观且易于使用的模型,...

    C#多线程编程实战7644OT_Code

    在这个压缩包"C#多线程编程实战7644OT_Code"中,很可能会有各种实际的代码示例,涵盖了上述的多线程编程技术和技巧,包括线程的创建与控制、任务的并行执行、线程池的使用、同步机制的实现以及异步编程的应用。...

Global site tag (gtag.js) - Google Analytics