8天玩转并行开发(C#并发)
### 并行开发入门:C#中的并行编程实践 #### 一、并行开发概述 随着计算机硬件的发展,多核处理器已经普及,这为并行编程提供了强大的硬件支持。并行编程能够充分利用多核处理器的优势,提高程序的执行效率。在.NET Framework 4.0及更高版本中,微软引入了`System.Threading.Tasks`命名空间,为开发者提供了更高级别的并行编程支持。 #### 二、并行与并发概念 在深入探讨并行编程之前,需要先理解两个关键概念:**硬件线程**和**软件线程**。 ##### 2.1 硬件线程(逻辑内核) 硬件线程,也称为逻辑内核,是指物理CPU中能够同时处理指令流的一个独立单元。在现代多核处理器中,每个物理内核通常会有一个或多个逻辑内核。例如,一颗具有超线程技术的四核CPU可能会有八个逻辑内核。 ##### 2.2 软件线程 软件线程,是指由操作系统调度和管理的执行单位。在多线程程序中,可以通过创建多个软件线程来实现任务的并行执行。软件线程的数量不受物理或逻辑内核数量的限制,但过多的线程会导致上下文切换开销增加。 #### 三、Parallel类简介 .NET Framework中的`System.Threading.Tasks.Parallel`类提供了一系列方法,用于简化并行编程的复杂度。主要方法包括: - `Invoke`: 可以并行执行多个委托。 - `For`: 提供并行循环的能力。 - `ForEach`: 支持并行地遍历集合。 #### 四、Parallel.Invoke详解 `Parallel.Invoke`是最简单的一种并行执行方式,它接受多个方法作为参数,并确保这些方法被并行执行。 **示例代码**: ```csharp using System; using System.Diagnostics; class Program { static void Main() { var watch = Stopwatch.StartNew(); watch.Start(); Run1(); Run2(); Console.WriteLine("我是串行开发,总共耗时:{0}\n", watch.ElapsedMilliseconds); watch.Restart(); Parallel.Invoke(Run1, Run2); watch.Stop(); Console.WriteLine("我是并行开发,总共耗时:{0}", watch.ElapsedMilliseconds); Console.Read(); } static void Run1() { Console.WriteLine("我是任务一,我跑了3s"); Thread.Sleep(3000); } static void Run2() { Console.WriteLine("我是任务二,我跑了5s"); Thread.Sleep(5000); } } ``` **分析**: - **串行执行**:两个任务依次执行,总耗时接近任务最长的执行时间。 - **并行执行**:两个任务几乎同时启动,总耗时接近两个任务执行时间之和中最短的那个。 #### 五、Parallel.For应用实例 `Parallel.For`提供了一种并行执行循环的方法。它可以自动将循环体分配给不同的线程进行并行处理。 **示例代码**: ```csharp using System; using System.Collections.Concurrent; using System.Diagnostics; class Program { static void Main() { for (int j = 1; j < 4; j++) { Console.WriteLine("\n第{0}次比较", j); ConcurrentBag<int> bag = new ConcurrentBag<int>(); var watch = Stopwatch.StartNew(); watch.Start(); for (int i = 0; i < 20000000; i++) { bag.Add(i); } Console.WriteLine("串行计算:集合有:{0},总共耗时:{1}", bag.Count, watch.ElapsedMilliseconds); GC.Collect(); bag = new ConcurrentBag<int>(); watch = Stopwatch.StartNew(); watch.Start(); Parallel.For(0, 20000000, i => { bag.Add(i); }); Console.WriteLine("并行计算:集合有:{0},总共耗时:{1}", bag.Count, watch.ElapsedMilliseconds); } } } ``` **分析**: - **串行循环**:通过普通的`for`循环逐个添加元素到集合中。 - **并行循环**:使用`Parallel.For`将循环体分配给多个线程,实现并行添加。 #### 六、并行编程注意事项 在使用并行编程时需要注意以下几点: 1. **减少依赖**:并行执行的任务之间应尽量减少依赖关系,避免因同步问题导致性能下降。 2. **线程安全**:使用线程安全的数据结构(如`ConcurrentBag`)来避免竞态条件。 3. **避免过度并行**:过多的线程会导致上下文切换开销增大,反而降低程序性能。 通过以上内容的学习,可以初步掌握C#中的并行编程技巧,并能够将其应用于实际项目中,提高程序的运行效率。
剩余67页未读,继续阅读
- qq_274903132017-10-21还可以一个文档,可以参考一线农码的博客。。。
- 粉丝: 1
- 资源: 18
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- java毕设项目之ssm线上旅行信息管理系统ssm+vue(完整前后端+说明文档+mysql+lw).zip
- 黑马最新Hive存储压缩以及Hive3性能优化PPT
- java毕设项目之ssm新生报到系统+jsp(完整前后端+说明文档+mysql+lw).zip
- java毕设项目之ssm小学生课外知识学习网站+vue(完整前后端+说明文档+mysql+lw).zip
- java毕设项目之ssm校园美食交流系统+vue(完整前后端+说明文档+mysql+lw).zip
- java毕设项目之ssm学生公寓管理中心系统的设计与实现+jsp(完整前后端+说明文档+mysql+lw).zip
- java毕设项目之ssm学校运动会信息管理系统+jsp(完整前后端+说明文档+mysql+lw).zip
- java毕设项目之ssm学生请假系统+jsp(完整前后端+说明文档+mysql+lw).zip
- java毕设项目之ssm医院门诊挂号系统+jsp(完整前后端+说明文档+mysql+lw).zip
- java毕设项目之ssm学院党员管理系统+jsp(完整前后端+说明文档+mysql+lw).zip
- java毕设项目之ssm亚盛汽车配件销售业绩管理统+jsp(完整前后端+说明文档+mysql+lw).zip
- 教师教学质量评价系统项目源代码全套技术资料.zip
- java毕设项目之ssm在线医疗服务系统+jsp(完整前后端+说明文档+mysql+lw).zip
- java毕设项目之ssm游戏攻略网站的设计与实现+vue(完整前后端+说明文档+mysql+lw).zip
- java毕设项目之ssm医院住院管理系统+vue(完整前后端+说明文档+mysql+lw).zip
- java毕设项目之ssm在线云音乐系统的设计与实现+jsp(完整前后端+说明文档+mysql+lw).zip