c#并行编程
第二章 命令式数据并行
几种并行类型:
数据并行
任务并行
流水线
在System.threading.tasks.parallel下
parallel.for
parallel.foreach(可以自定义parytitioner)
parallel.invoke
1. Parallel.Invoke
没有特定执行顺序
交错并发:逻辑内核通过时间片机制和快速上下文切换实现并行的假象
并发:不解释
热点:潜在的可并行代码
加速比:串行执行时间/并行执行时间
2. Parallel.for
每一次迭代一会当作一个任务交给一个线程
迭代范围上界判断是小于,所以需要加一
3. Parallel.ForEach
可以通过partitioner分区器进行分区,每一个迭代处理一个分区,Tuple<int,int>
退出
ParallelLoopState
Break: 不会马上结束,执行完小于当前迭代的内容
Stop:尽快退出
ParallelLoopResult
IsCompleted 循环完成
!IsCompleted && !LowestBreakIteration.HasValue Stop终止
!IsCompleted && LowestBreakIteration.HasValue Break终止
AggregateException
.InnerExceptions内部异常集合
parallelOptions
maxDegreeoOfParallelism并行度
CancellationToken取消token
taskScheduler任务调度器
第三章 命令式并行任务并行
System.Threading.Tasks.Task
一个task代表一个异步操作,并不针对一个线程
状态
TaskStatus.Created初始状态
.WaitingForActivation依赖其他任务的任务的初始状态
.WaitingToRun通过TaskFactory.StartNew所创建的任务的初始状态
.Cancelled
.Faulted
.RunToCompletion
task.Start()
task.Wait() 等待也都有超时的重载
Task.WaitAll()
Task.TaskFactory.StartNew方法可以参数传入cancellationToken,或者TaskCreationOptions
TaskCreationOption
.AttachedToParent与一个父任务关联
.None默认行为
.LongRunning长时间操作,调度器可对其用粗颗粒度的操作,一般大于一秒
.PreferFairness告诉调度器,更早被调度的任务更早执行
task.ContinueWith延续任务
TaskContinuationOptions操作或者条件