- 1、本文档共68页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
8 天玩转并行开发——第一天 Parallel 的使用
随着多核时代的到来,并行开发越来越展示出它的强大威力,像我们这样的码农再也
不用过多的关注底层线程的实现和手工控制,
要了解并行开发,需要先了解下两个概念:“硬件线程”和“软件线程”。
1. 硬件线程
相信大家手头的电脑都是双核以上的,像我这样古董的电脑都是双核的,这样的双核叫
做物理内核。
硬件线程又叫做逻辑内核,我们可以在”任务管理器“中查看”性能“标签页,如下图,我们知
道有2 个硬件线程。
一般情况下,一个物理内核对应一个逻辑内核,比如我这里的2 对2。当然如果你的cpu
采用的是超线程技术,那么可能就会有4 个物理内核对应
8 个硬件线程,现在有很多服务器都有8 个硬件线程,上午在公司的服务器上截了个图。
我们要知道并行开发要做的事情就是将任务分摊给这些硬件线程去并行执行来达到负载和
加速。
2. 软件线程
相信这个大家最熟悉了,我们知道传统的代码都是串行的,就一个主线程,当我们为了
实现加速而开了很多工作线程,这些工作线程
也就是软件线程。
好,我们知道了基本概念就ok 了,在.net 4.0 中,微软给我们提供了一个新的命名空间:
System.Threading.Tasks。这里面有很多好玩
的东西,作为第一篇就介绍下最基础,最简单的Parallel 的使用。
一: Parallel 的使用
在Parallel 下面有三个常用的方法invoke,for 和forEach。
1: Parallel.Invoke
这是最简单,最简洁的将串行的代码并行化。
1 class Program
2 {
3 static void Main(string[] args)
4 {
5 var watch = Stopwatch.StartNew();
6
7 watch.Start();
8
9 Run1();
10
11 Run2();
12
13 Console.WriteLine(我是串行开发,总共耗时:{0}\n,
watch.ElapsedMilliseconds);
14
15 watch.Restart();
16
17 Parallel.Invoke(Run1, Run2);
18
19 watch.Stop();
20
21 Console.WriteLine(我是并行开发,总共耗时:{0}, watch.ElapsedMilliseconds);
22
23 Console.Read();
24 }
25
26 static void Run1()
27 {
28 Console.WriteLine(我是任务一,我跑了3s);
29 Thread.Sleep(3000);
30 }
31
32 static void Run2()
33 {
34 Console.WriteLine(我是任务二,我跑了5s);
35 Thread.Sleep(5000);
36 }
37 }
在这个例子中可以获取二点信息:
第一:一个任务是可以分解成多个任务,采用分而治之的思想。
第二:尽可能的避免子任务之间的依赖性,因为子任务是并行执行,所以就没有谁一定在前,
谁一定在后的规定了。
2:Parallel.for
我们知道串行代码中也有一个for,但是那个for 并没有用到多核,而Paraller.for 它会在
底层根据硬件线程的运行状况来充分的使用所有的可
利用的硬件线程,注意这里的Parallel.for 的步行是1。
这里我们来演示一下,向一个线程安全的集合插入数据,当然这个集合采用原子性来实现线
程同步,比那些重量级的锁机制更加的节省消耗。
1 class Program
2 {
3 static
文档评论(0)