tpl是什么( 三 )


TIP:一个时间片结束时,如果Windows决定再次调度同一个线程(而不是切换到另外给一个线程),那么Windows不会执行上下文切换 。线程将继续执行,这显著改进了性能 。设计自己的代码时注意,上下文切换能避免的就要尽量避免 。
2.3 CPU的发展
过去,CPU速度一直随着时间在变快 。所以,在一台旧机器上运行得慢的程序在新机器上一般会快些 。然而,CPU 厂商没有延续CPU越来越快的趋势 。由于CPU厂商不能做到一直提升CPU的速度,所以它们侧重于将晶体管做得越来越小,使一个芯片上能够容纳更多的晶体管 。今天,一个硅芯片可以容纳2个或者更多的CPU内核 。这样一来,如果在写软件时能利用多个内核,软件就能运行得更快些 。
今天的计算机使用了以下三种多CPU技术 。
多个CPU超线程芯片多核芯片2.4 使用线程的理由
使用线程有以下三方面的理由 。
使用线程可以将代码同其他代码隔离这将提高应用程序的可靠性 。事实上,这正是Windows在操作系统中引入线程概念的原因 。Windows之所以需要线程来获得可靠性,是因为你的应用程序对于操作系统来说是的第三方组件,而微软不会在你发布应用程序之前对这些代码进行验证 。如果你的应用程序支持加载由其它厂商生成的组件,那么应用程序对健壮性的要求就会很高,使用线程将有助于满足这个需求 。
可以使用线程来简化编码有的时候,如果通过一个任务自己的线程来执行该任务,或者说单独一个线程来处里该任务,编码会变得更简单 。但是,如果这样做,肯定要使用额外的资源,也不是十分“经济”(没有使用尽量少的代码达到目的) 。现在,即使要付出一些资源作为代价,我也宁愿选择简单的编码过程 。否则,干脆坚持一直用机器语言写程序好了,完全没必要成为一名C#开发人员 。但有的时候,一些人在使用线程时,觉得自己选择了一种更容易的编码方式,但实际上,它们是将事情(和它们的代码)大大复杂化了 。通常,在你引入线程时,引入的是要相互协作的代码,它们可能要求线程同步构造知道另一个线程在什么时候终止 。一旦开始涉及协作,就要使用更多的资源,同时会使代码变得更复杂 。所以,在开始使用线程之前,务必确定线程真的能够帮助你 。
可以使用线程来实现并发执行 如果(而且只有)知道自己的应用程序要在多CPU机器上运行,那么让多个任务同时运行,就能提高性能 。现在安装了多个CPU(或者一个多核CPU)的机器相当普遍,所以设计应用程序来使用多个内核是有意义的 。3 数据并行(Data Parallelism)
3.1 数据并行
数据并行是指对源集合或数组中的元素同时(即并行)执行相同操作的情况 。在数据并行操作中,源集合被分区,以便多个线程可以同时在不同的段上操作 。
数据并行性是指对源集合或数组中的元素同时任务并行库(TPL)通过system.threading.tasks.parallel类支持数据并行 。这个类提供了for和for each循环的基于方法的并行实现 。
您为parallel.for或parallel.foreach循环编写循环逻辑,就像编写顺序循环一样 。您不必创建线程或将工作项排队 。在基本循环中,您不必使用锁 。底层工作TPL已经帮你处理 。
下面代码展示顺序和并行:
// Sequential version foreach (var item in sourceCollection){ Process(item);}// Parallel equivalentParallel.ForEach(sourceCollection, item = Process(item));并行循环运行时,TPL对数据源进行分区,以便循环可以同时在多个部分上运行 。在后台,任务调度程序根据系统资源和工作负载对任务进行分区 。如果工作负载变得不平衡,调度程序会在多个线程和处理器之间重新分配工作 。
下面的代码来展示如何通过Visual Studio调试代码:
public static void test() { int[] nums = Enumerable.Range(0, 1000000).ToArray(); long total = 0;// Use type parameter to make subtotal a long, not an int Parallel.Forlong(0, nums.Length, () = 0, (j, loop, subtotal) = { subtotal += nums[j]; return subtotal; }, (x) = Interlocked.Add(ref total, x) ); Console.WriteLine("The total is {0:N0}", total); Console.WriteLine("Press any key to exit"); Console.ReadKey(); }选择调试开始调试,或按F5 。应用在调试模式下启动,并会在断点处暂停 。在中断模式下打开线程通过选择窗口调试Windows线程 。您必须位于一个调试会话以打开或请参阅线程和其他调试窗口 。3.2 Parallel.For剖析
【tpl是什么】查看Parallel.For的底层,
public static ParallelLoopResult ForTLocal(int fromInclusive, int toExclusive, FuncTLocal localInit, Funcint, ParallelLoopState, TLocal, TLocal body, ActionTLocal localFinally);清楚的看到有个func函数,看起来很熟悉 。