`

.NET 4.0 多任务编程 之二 线程安全的集合

阅读更多
随着多核计算机的普及,并行编程技术,也就是多核编程技术也逐渐称为开发的主流。为此,在.NET 4 中就引入了“并行编程”。在.NET 4 中一些列的Library和类为并行编程提供了支持,如:Task Parallel Library,Parallel LINQ等。

在.NET 1.0并行编程技术主要依赖于多线线程技术。多线程最大的问题就是难于使用和管理。在使用多线程的使用,因为它的复杂性,往往使用我们把注意力分散了多线程上。而致使我们的最初目的被掩盖了,比如下面这个例子:
void Add(String x)
{ 
   _collection.Add(x);
}
void List()
{
   foreach(int val in _collection)
     //do something
} 


假如我们使用两个线程,一个进行添加操作,另外一个则进行简单的读操作,很大可能性会抛出一个InvalidOperationException, 因为系统发现集合在读取的同时被修改了。传统的应对方法,就是手工对要操作的对象加锁。即我们可以在对_collection集合进行操作之前对其添加代码lock(_collection)。

然而这种方式毕竟不够简洁,并且在更复杂的情况下它可能会显得非常繁琐,而且容易出错。这时候支持并行操作的集合应运而生了。

Concurrent集合
和Java集合设计的一团混乱相比,.NET将线程安全的集合单独放在System.Collections.Concurrent这个名称空间里,这些类分别存在于两个不同的dll中,其中在System.dll中有
  • BlockingCollection<T>
  • ConcurrentBag<T>

在mscorlib.dll中则稍多一些,他们分别是
  • ConcurrentQueue<T>
  • ConcurrentStack<T>
  • ConcurrentDictionary<TKey, TValue>

首先看看mscorlib中的几个类,这些类和.NET 2.0中普通版本相比,功能基本不变,因此你仍然可以像使用普通的哈希表,队列和堆栈来使用它们。唯一区别比较大的也是在Concurrent命名空间中很常见的各种try函数操作。
在System.dll中的并行集合,这里面的两个类在以前的.NET中是没有的。
首先看看ConcurrentBag<T>,顾名思义,这个类提供并行数据包的功能,这个类相对来说构造比较简单,它继承自四个接口:
  • IProducerConsumerCollection<T>
  • IEnumerable<T>
  • ICollection
  • IEnumerable

IProducerConsumerCollection<T> 是个新的接口,这个接口提供了生产者/消费者的集合操作,它提供了四个基本的方法:CopyTo(T[],int), ToArray(), TryAdd(T), TryTake(out T)。其中我们主要关注后面的两个方法,TryAdd是添加元素操作,而TryTake则是取元素操作。
不过在ConcurrentBag中,TryAdd方法被设置为protected,外部对象需要通过Add操作来添加元素。另外,取元素的话,除了TryTake之外,我们还可以通过TryPeek来取集合当前的最后一个元素而不删除它。上面的例子经过简单修改之后,就可以避免线程冲突的错误
static void main(){
    ConcurrentBag<string> bag = new ConcurrentBag<string>();
    Task.Factory.StartNew(() =>
    {
        for (int i = 0; i < 1000; i++)
        {
            bag.Add(i.ToString());
        }
        bag.Add("Last");
    });
    Task.Factory.StartNew(() =>
    {
        foreach (string item in bag)
        {
            Console.WriteLine(item);
        }
    }).Wait();} 

BlockingCollection<T>相对来说,要稍微复杂一些,它也提供了比ConcurrentBag更加丰富的功能。如CompleteAdding和超时设置的TryAdd和TryTake方法等等。

新特性
并行类同时还提供了一些更丰富的功能,由于Lamda表达式的引入,现在在ConcurrentDictionary<TKey, TValue>你可以通过AddOrUpdate或GetOrAdd添加自己的值生成方案。这使得我们在生成键值对的时候更加方便和简单了。如:
ConcurrentDictionary<int, string> td = new ConcurrentDictionary<int, string>();
Func<int, string> genVar = (i) => i.ToString();
Task.Factory.StartNew(() =>{
    for (int i = 0; i < 1000; i++)    {
        td.GetOrAdd(i, genVar);    }});

Task.Factory.StartNew(() =>{
    Func<int, string, string> updateVar = (key, oldVar) => oldVar + key;
    td.AddOrUpdate(0, genVar, updateVar);
    Console.WriteLine(td[0]);}).Wait(); 




如果读取共享状态比写入该状态花的时间要长得多(这是常有的情况),读/写锁就被广泛使用以提高可扩展性。


参考:
http://www.bluebytesoftware.com/blog/2009/01/30/ASinglewordReaderwriterSpinLock.aspx
分享到:
评论

相关推荐

    .NET 4.0 技术亮点剖析

    - **动态编程语言支持**:.NET 4.0 引入了对动态语言的支持,这意味着开发者可以在 .NET 框架中使用 Python 或 Ruby 等动态语言编写代码。这种灵活性让开发者能够根据项目需求选择最适合的语言进行开发。 - **动态...

    .net 4.0版本资源

    .NET Framework 4.0的并行计算库(TPL)使得开发者可以轻松利用多核硬件的潜力,通过任务并行、数据并行和并发集合等功能实现高效的多线程编程。 8. **内存管理优化**: .NET 4.0改进了垃圾回收机制,减少了对...

    .net framework4.0 x64_x86简体中文语言包

    2. **并行计算支持**:引入了Task Parallel Library(任务并行库),允许开发者轻松地编写并行和多线程代码,充分利用多核处理器的优势。 3. **动态语言支持**:引入了Dynamic Language Runtime(DLR),使得动态...

    .NET Framework 4.0全

    .NET Framework 4.0还改进了多线程和并发处理,使得开发者更容易地创建高性能的多核应用。另外,它引入了ADO.NET Entity Framework 4.0,这是一个对象关系映射工具,可以帮助开发者更方便地处理数据库操作,减少与...

    ASP.NET多线程编程(一)

    ASP.NET多线程编程是开发高效、响应迅速的Web应用程序的关键技术之一。在现代Web服务和应用程序中,多线程可以提升系统并发处理能力,优化资源利用率,尤其在执行耗时任务时,如后台数据处理、异步I/O操作等。本文将...

    .NET 4.0并行编程简介

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

    Introducing.dot.NET.4.0.with.Visual.Studio.2010

    3. **异步编程模型**:为了解决UI线程阻塞问题,.NET 4.0引入了基于任务的异步编程模型(TAP),使异步操作更加简洁且易于理解。 4. **动态类型和DLR**:动态语言运行时(DLR)的加入,使得.NET可以更好地支持动态...

    ASP.NET多线程技术.

    ASP.NET多线程技术是开发高效、响应迅速的Web应用程序的关键技术之一。它允许开发者在同一个应用程序中同时执行多个任务,提升系统性能并优化用户体验。本文将深入探讨ASP.NET多线程的基础概念、应用场景以及最佳...

    NET+Framework+4.0+常用类库参考手册(节选)

    8. **System.Threading.Tasks**:在.NET 4.0中引入了任务并行库(TPL),提供了Task类和Parallel类,简化了多线程和异步编程。 9. **System.Windows.Forms** 和 **System.Web.UI**:分别用于Windows桌面应用和Web...

    .NET-4.0中的并行开发.docx

    `ConcurrentCollections`如`ConcurrentBag`, `ConcurrentDictionary`, 和 `ConcurrentQueue`等线程安全集合类,提供了在多线程环境下安全的数据存储和访问。 总的来说,.NET 4.0的并行库提供了一套全面的工具,使...

    DotNet4.0- C#基类库大全苏飞版

    5. **并行编程框架**:.NET 4.0引入了Task Parallel Library (TPL),提供了一组强大的并行编程工具,包括任务、并行foreach循环、并发队列等,使得多核处理器下的性能优化变得简单。 6. **垃圾回收优化**:.NET 4.0...

    NET4.0并行计算技术基础

    .NET 4.0通过AggregateException类提供了一种统一的方式来捕获和处理多个并行任务中抛出的异常。 九、并行调试和性能分析 Visual Studio 2010及更高版本提供了并行堆栈窗口和任务窗口,帮助开发者调试并行代码。...

    vb.net.rar_net process thre_vb.net_vb.net Proce_vb.net 多线程

    在VB.NET中,多线程编程是一个核心概念,特别是在开发高效、响应迅速的应用程序时。VB.NET通过使用公共语言运行时(Common Language Runtime,CLR)提供了对多线程的强大支持,使得开发者能够轻松地创建并发执行任务...

    C#.NET多线程实例6个(包括多线程基本使用,多线程互斥等全部多线程使用实例)_26.rar

    8. **线程池**:线程池是系统管理的一组线程集合,用于执行短期任务。使用线程池可以减少线程创建和销毁的开销,提高系统效率。 9. **死锁和活锁**:在多线程编程中,死锁是指两个或多个线程互相等待对方释放资源而...

    .net版本简单线程调用源码

    4. **异步编程与任务并行库(TPL)**:`.NET Framework 4.0`引入了任务并行库(Task Parallel Library,TPL),简化了多线程编程。`Task`类代表一个可异步执行的操作,可以更方便地处理并发。例如: ```csharp Task ...

    C#.NET多线程实例6个(包括多线程基本使用,多线程互斥等全部多线程使用实例)

    在.NET框架中,C#语言提供了强大的多线程支持,使得开发者可以同时执行多个任务,提升程序的执行效率。本文将深入探讨C#.NET多线程的基本使用、线程同步和互斥等关键知识点,结合六个实例进行详细解析。 1. **多...

    VB.NET 多线程 2010

    在VB.NET编程环境中,多线程技术是一种关键的性能优化手段,特别是在开发复杂的、资源密集型的应用程序时。"VB.NET 多线程 2010" 主要关注的是如何在Visual Basic .NET 2010版本中有效地利用多线程来提升程序的并发...

    C#.NET多线程实例6个(包括多线程基本使用,多线程互斥等全部多线程使用实例).rar

    C#.NET多线程是.NET框架中用于实现并发执行任务的关键技术。在现代软件开发中,多线程已经成为提升程序性能、改善用户体验的重要手段。这个压缩包包含六个C#.NET多线程的实例,涵盖了多线程的基本使用以及互斥等高级...

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

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

Global site tag (gtag.js) - Google Analytics