C#并行编程

基本概念

并行编程的实现方式

从业务实现的角度看并行策略
并行编程模型分为数据并行与任务并行。
从硬件实现的角度看并行策略
并行又分为单机多核并行和多机多核并行。

任务并行库(TPL)及其分类

1.任务并行库(TPL)基于任务的并行编程模型,主要借助System.Threading.Tasks.Parallel类实现。
2.TPL的核心是Parallel类和PLINQ,编写并行程序的首选方案。
3.TPL的分类:
数据并行
~对源集合或者数组中的元素同时执行相同操作。
~借助Parallel类的For或Foreach方法来实现。
任务并行
~借助Parallel类提供的静态方法Invoke实现任务并行。
并行查询
~并行实现LINQ to Objects查询,即PLINQ。
4.TPL与传统多线程编程模型相比的优势
(1)TPL编程模型使用CLR线程池执行多个任务,并能自动处理工作分区、线程调度和取消、状态管理以及其他低级别的细节操作。
(2)TPL还会动态地按比例调节并发程度,从而最有效地使用所有可用的处理器。
(3)TPL比Thread更具智能性,当它通过试探法来预判任务集不会从并行运行中获得性能优势时,还会自动选择按顺序运行。
5.并行编程建议的做法:
并非所有的任务都适合并行。
这里特别强调的是,不论是数据并行、任务并行还是并行查询,在实际项目中都不应该在并行循环的内部频繁地和界面交互,这是因为频繁地调用共享资源(如界面控件、控制台或文件系统)会大幅降低并行循环的性能。

Parallel类及其帮助器类

Parallel类提供的并行方法:

Parallel.For方法用于并行执行for循环。
Parallel.Foreach方法用于并行执行foreach循环。
Parallel.Invoke方法用于任务并行。

Parallel帮助器类

ParallelOptions类:为并行方法提供操作选项。
~~CancellationToken:获取或设置取消标志
~~TaskScheduler:默认值为null

Parallel帮助器类

ParallelLoopState类:将Parallel循环的迭代与其他迭代交互。
~~Break方法:告知Parallel循环尽早停止执行当前迭代之外的迭代。
~~Stop方法:告知Parallel循环尽早停止执行。
ParallelLoopResult:提供Parallel循环的完成状态。
~~IsCompleted:获取该循环是否已经完成。

用于线程全局变量的设计结构

基本概念:线程全局变量,线程局部变量
全局变量同步和冲突的解决:用volatile修饰变量,或者使用原子操作(Interlocked类提供的静态方法)。
并发集合类:常用的并发集合类有ConcurrentBag。
从.NET框架4.0开始,在System.Collections.Concurrent命名空间下,增加了用于多线程协同的并发集合类,这些并发集合类自动解决了可能会导致的各种冲突问题,不需要开发人员再使用“锁”去处理。

数据并行

1.Parallel.For方法
Parallel.For方法用于并行执行for循环。静态的For方法有12种重载形式(6种32位重载,6种64位重载)
For(Int32, Int32, Action)
For(Int32, Int32, ParallelOptions, Action)
For(Int32, Int32, Action<Int32, ParallelLoopState>)
For(Int32, Int32, ParallelOptions, Action<Int32, ParallelLoopState>)
For(Int32, Int32, Func, Func<Int32, ParallelLoopState, TLocal, TLocal>, Action)
For(Int32, Int32, ParallelOptions, Func, Func<Int32, ParallelLoopState, TLocal, TLocal>, Action)
一般形式如下:
Parallel.For(<开始索引>,<结束索引>,<每次迭代执行的委托>)
2.带并行选项的Parallel.For循环
For(Int32, Int32, ParallelOptions, Action)

其完整的语法如下:
public static ParallelLoopResult For(
int fromInclusive, //开始索引(包含)
int toExclusive, //结束索引(不包含)
ParallelOptions parallelOptions, //并行选项
Action body //每个迭代调用的委托
)
3.带并行循环状态的Parallel.For循环
For(Int32, Int32, Action<Int32,ParallelLoopState>)

其完整的语法如下:
public static ParallelLoopResult For(
int fromInclusive, //开始索引(包含)
int toExclusive, //结束索引(不包含)
Action<int, ParallelLoopState> body //每个迭代调用的委托
)
4.带线程局部变量的Parallel.For循环
线程局部变量是指某个线程内的局部变量,其他线程无法访问。线程局部变量保存的数据称为线程本地数据。

public static ParallelLoopResult For(
int fromInclusive, //开始索引(包含)
int toExclusive, //结束索引(不包含)
Func localInit, //返回每个任务初始化的状态
Func<int, ParallelLoopState, TLocal, TLocal> body, //每个迭代调用一次
Action localFinally //对每个任务执行一个最终操作
)

利用Parallel.ForEach方法实现数据并行

1.简单的Parallel.ForEach循环
ForEach(IEnumerable, Action)
2.按范围分区加快小型循环体速度

任务并行

任务并行是指同时运行一个或多个独立的任务,而且并行的任务都是异步执行的。
6.4.1 Parallel.Invoke方法
Parallel.Invoke方法用于任务并行。重载形式有:
~~public static void Invoke(Action[] actions )
~~public static void Invoke(ParallelOptions parallelOptions, Action[] actions )
这两种方式都是尽可能并行执行提供的操作,采用第二种重载形式还可以取消操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值