欢迎来到天天文库
浏览记录
ID:12873621
大小:152.07 KB
页数:0页
时间:2018-07-19
《并行开发——parallel》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、并行开发——Parallel随着多核时代的到来,并行开发越来越展示出它的强大威力,像我们这样的码农再也不用过多的关注底层线程的实现和手工控制,要了解并行开发,北大青鸟中关村学士后本部:需要先了解下两个概念:“硬件线程”和“软件线程”。 1.硬件线程 相信大家手头的电脑都是双核以上的,像我这样古董的电脑都是双核的,这样的双核叫做物理内核。 硬件线程又叫做逻辑内核,我们可以在”任务管理器“中查看”性能“标签页,如下图,我们知道有2个硬件线程。北大青鸟中关村学士后本部北京市海淀区中关村大街49号大华科技商厦A座2层 一般情况下,一个物理内核对应一个逻辑内核,比如我这
2、里的2对2。当然如果你的cpu采用的是超线程技术,那么可能就会有4个物理内核对应8个硬件线程,现在有很多服务器都有8个硬件线程,上午在公司的服务器上截了个图。北大青鸟中关村学士后本部北京市海淀区中关村大街49号大华科技商厦A座2层我们要知道并行开发要做的事情就是将任务分摊给这些硬件线程去并行执行来达到负载和加速。 2.软件线程 相信这个大家最熟悉了,我们知道传统的代码都是串行的,就一个主线程,当我们为了实现加速而开了很多工作线程,这些工作线程也就是软件线程。 好,我们知道了基本概念就ok了,在.net4.0中,微软给我们提供了一个新的命名空间:System.Th
3、reading.Tasks。这里面有很多好玩的东西,作为第一篇就介绍下最基础,最简单的Parallel的使用。 北大青鸟中关村学士后本部北京市海淀区中关村大街49号大华科技商厦A座2层 一: Parallel的使用在Parallel下面有三个常用的方法invoke,for和forEach。1: Parallel.Invoke 这是最简单,最简洁的将串行的代码并行化。1classProgram2{3staticvoidMain(string[]args)4{5varwatch=Stopwatch.StartNew();北大青鸟中关村学士后本部北京市海淀区中关村大街
4、49号大华科技商厦A座2层67watch.Start();89Run1();1011Run2();1213Console.WriteLine("我是串行开发,总共耗时:{0}",watch.ElapsedMilliseconds);1415watch.Restart();1617Parallel.Invoke(Run1,Run2);1819watch.Stop();2021Console.WriteLine("我是并行开发,总共耗时:{0}",watch.ElapsedMilliseconds);2223Console.Read();24}2526static
5、voidRun1()27{28Console.WriteLine("我是任务一,我跑了3s");29Thread.Sleep(3000);30}3132staticvoidRun2()33{34Console.WriteLine("我是任务二,我跑了5s");35Thread.Sleep(5000);36}37}北大青鸟中关村学士后本部北京市海淀区中关村大街49号大华科技商厦A座2层在这个例子中可以获取二点信息:第一:一个任务是可以分解成多个任务,采用分而治之的思想。第二:尽可能的避免子任务之间的依赖性,因为子任务是并行执行,所以就没有谁一定在前,谁一定在后的规定
6、了。 2:Parallel.for 我们知道串行代码中也有一个for,但是那个for并没有用到多核,而Paraller.for它会在底层根据硬件线程的运行状况来充分的使用所有的可利用的硬件线程,注意这里的Parallel.for的步行是1。这里我们来演示一下,向一个线程安全的集合插入数据,当然这个集合采用原子性来实现线程同步,比那些重量级的锁机制更加的节省消耗。1classProgram2{3staticvoidMain(string[]args)4{5for(intj=1;j<4;j++)6{7Console.WriteLine("第{0}次比较",j);8
7、9ConcurrentBagbag=newConcurrentBag();1011varwatch=Stopwatch.StartNew();1213watch.Start();北大青鸟中关村学士后本部北京市海淀区中关村大街49号大华科技商厦A座2层1415for(inti=0;i<20000000;i++)16{17bag.Add(i);18}1920Console.WriteLine("串行计算:集合有:{0},总共耗时:{1}",bag.Count,watch.ElapsedMilliseconds);2122GC.Collect();2
8、324ba
此文档下载收益归作者所有