前面一篇提到例子都是数据并行,但这并不是并行化的唯一形式,在.Net4之前,必须要创建多个线程或者线程池来利用多核技术.现在只需要使用新的Task实例就可以通过更简单的代码解决命令式任务并行问题. 1.Task及它的生命周期 一个Task表示一个异步操作,它的创建和执行都是独立的,因此可以对相关操作的执行拥有完全的控制权:当有很多异步操作作为Task实例加载的时候,为了充分利用运行时的逻辑内核,任务调度器会尝试并行的运行这些任务,当然任务都是有额外的开销,虽然要小于添加线程的开销: 对Task实…
一直觉得自己对并发了解不够深入,特别是看了<代码整洁之道>觉得自己有必要好好学学并发编程,因为性能也是衡量代码整洁的一大标准.而且在<失控>这本书中也多次提到并发,不管是计算机还是生物都并发处理着各种事物.人真是奇怪,当你关注一个事情的时候,你会发现周围的事物中就常出现那个事情.所以好奇心驱使下学习并发.便有了此文. 一.理解硬件线程和软件线程 多核处理器带有一个以上的物理内核--物理内核是真正的独立处理单元,多个物理内核使得多条指令能够同时并行运行.硬件线程也称为逻辑内核,一个物…
Net并行编程高级教程--Parallel 一直觉得自己对并发了解不够深入,特别是看了<代码整洁之道>觉得自己有必要好好学学并发编程,因为性能也是衡量代码整洁的一大标准.而且在<失控>这本书中也多次提到并发,不管是计算机还是生物都并发处理着各种事物.人真是奇怪,当你关注一个事情的时候,你会发现周围的事物中就常出现那个事情.所以好奇心驱使下学习并发.便有了此文. 一.理解硬件线程和软件线程 多核处理器带有一个以上的物理内核--物理内核是真正的独立处理单元,多个物理内核使得多条指令能够…
这个章节我个人感觉意义不大,使用现有的APM(异步编程模型)和EAP(基于时间的异步模型)就很够用了,针对WPF和WinForm其实还有一些专门用于UI更新的类. 但是出于完整性,还是将一下怎么使用.NET4的并行扩展,也就是一直在使用Task模型来处理异步问题.有一个特别好处是,当有大量并发的IO操作时会有更好的效果. 大量并发的IO操作的含义是类似如下 private List<Task<int>> tasks; 有一堆的task,其中的每一个task都是一个异步的IO操作.…
本章介绍了一些轻量级的同步原语,其中有很大部分是.NET Framework 4才引入的. System.Threading.Barrier 用于一段程序分成多个阶段,每个阶段的开始都需要之前的阶段完成.如果这段程序需要并行化.可以在每段之间采用Barrier. 还可以设置在每个阶段之间的动作. task在Barrier中成为参与者(participant),在构造的时候要设定数量,也可以动态的增删. 异常和超时的处理可以参考代码. 相比于使用使用Task的ContinueWith方法实现多个阶…
PLINQ这个话题好多书都写到过,这本也没有什么特别好的地方. 几个有用和有趣的点记录一下.   顺序的不确定性 用PLINQ就一定要记住并行后会导致顺序不确定的问题.解决方案就是AsOrdered或者orderby子句. var keysWith10Letters )                            )                            && (key.Contains('A'))                            &…
这一章主要介绍了System.Collections.Concurrent下的几个类. ConcurrentQueue<T> 并发队列.完全无锁,使用CAS(compare-and-swap)比较并交换和自旋重试来实现线程安全. //加入队尾public void Enqueue(T item)//尝试删除队头,并将元素通过out返回,返回值表示是否操作成功public bool TryDequeue(out T result)//尝试获取队头,通过out返回元素,返回值为代表是否操作成功pu…
Parallel.Invoke 并行执行多个方法,只有在所有方法都执行后才会返回 static void Main(string[] args){    Parallel.Invoke(    () => ConvertEllipses(),    () => ConvertRectangles(),    () => ConvertLines(),    () => ConvertText());    System.Console.ReadLine();} static voi…
主要的几个概念(详细最好还是看书,配合插图看)   任务是会被分配到线程上的,而这些线程都在线程池引擎下管理 线程池引擎管理着合适数量的线程池,线程从全局队列获取工作项执行. .NET4 Framework 4改进了全局队列的加入和退出算法,使用了无锁的方式. 通常还是建议使用包装后的Task,但是也是可以直接为ThreadPool加入工作项的,参考代码如下 ThreadPool.QueueUserWorkItem(    (state) =>    {        //...    }, p…
没有什么好说的,主要是将调试模式下的Parallel Tasks窗体和Parallel Stacks窗体.折腾一下应该比看书效果好.(表示自己没有折腾过) 另外值得注意的是,主线程不是一个任务.所以主线程不会出现在任务列表或任务图中. 来自为知笔记(Wiz)…