資源描述:
《并行開發(fā)——parallel》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、并行開發(fā)——Parallel隨著多核時代的到來,并行開發(fā)越來越展示出它的強(qiáng)大威力,像我們這樣的碼農(nóng)再也不用過多的關(guān)注底層線程的實現(xiàn)和手工控制,要了解并行開發(fā),北大青鳥中關(guān)村學(xué)士后本部:需要先了解下兩個概念:“硬件線程”和“軟件線程”。?1.硬件線程??相信大家手頭的電腦都是雙核以上的,像我這樣古董的電腦都是雙核的,這樣的雙核叫做物理內(nèi)核。?硬件線程又叫做邏輯內(nèi)核,我們可以在”任務(wù)管理器“中查看”性能“標(biāo)簽頁,如下圖,我們知道有2個硬件線程。北大青鳥中關(guān)村學(xué)士后本部北京市海淀區(qū)中關(guān)村大街49號大華科技商廈A座2層??一般情況下,一個物理內(nèi)核對應(yīng)一個邏輯內(nèi)核,比如我這
2、里的2對2。當(dāng)然如果你的cpu采用的是超線程技術(shù),那么可能就會有4個物理內(nèi)核對應(yīng)8個硬件線程,現(xiàn)在有很多服務(wù)器都有8個硬件線程,上午在公司的服務(wù)器上截了個圖。北大青鳥中關(guān)村學(xué)士后本部北京市海淀區(qū)中關(guān)村大街49號大華科技商廈A座2層我們要知道并行開發(fā)要做的事情就是將任務(wù)分?jǐn)偨o這些硬件線程去并行執(zhí)行來達(dá)到負(fù)載和加速。?2.軟件線程??相信這個大家最熟悉了,我們知道傳統(tǒng)的代碼都是串行的,就一個主線程,當(dāng)我們?yōu)榱藢崿F(xiàn)加速而開了很多工作線程,這些工作線程也就是軟件線程。?好,我們知道了基本概念就ok了,在.net4.0中,微軟給我們提供了一個新的命名空間:System.Th
3、reading.Tasks。這里面有很多好玩的東西,作為第一篇就介紹下最基礎(chǔ),最簡單的Parallel的使用。?北大青鳥中關(guān)村學(xué)士后本部北京市海淀區(qū)中關(guān)村大街49號大華科技商廈A座2層?一:?Parallel的使用在Parallel下面有三個常用的方法invoke,for和forEach。1:?Parallel.Invoke??這是最簡單,最簡潔的將串行的代碼并行化。1classProgram2{3staticvoidMain(string[]args)4{5varwatch=Stopwatch.StartNew();北大青鳥中關(guān)村學(xué)士后本部北京市海淀區(qū)中關(guān)村大街
4、49號大華科技商廈A座2層67watch.Start();89Run1();1011Run2();1213Console.WriteLine("我是串行開發(fā),總共耗時:{0}",watch.ElapsedMilliseconds);1415watch.Restart();1617Parallel.Invoke(Run1,Run2);1819watch.Stop();2021Console.WriteLine("我是并行開發(fā),總共耗時:{0}",watch.ElapsedMilliseconds);2223Console.Read();24}2526static
5、voidRun1()27{28Console.WriteLine("我是任務(wù)一,我跑了3s");29Thread.Sleep(3000);30}3132staticvoidRun2()33{34Console.WriteLine("我是任務(wù)二,我跑了5s");35Thread.Sleep(5000);36}37}北大青鳥中關(guān)村學(xué)士后本部北京市海淀區(qū)中關(guān)村大街49號大華科技商廈A座2層在這個例子中可以獲取二點信息:第一:一個任務(wù)是可以分解成多個任務(wù),采用分而治之的思想。第二:盡可能的避免子任務(wù)之間的依賴性,因為子任務(wù)是并行執(zhí)行,所以就沒有誰一定在前,誰一定在后的規(guī)定
6、了。?2:Parallel.for?我們知道串行代碼中也有一個for,但是那個for并沒有用到多核,而Paraller.for它會在底層根據(jù)硬件線程的運(yùn)行狀況來充分的使用所有的可利用的硬件線程,注意這里的Parallel.for的步行是1。這里我們來演示一下,向一個線程安全的集合插入數(shù)據(jù),當(dāng)然這個集合采用原子性來實現(xiàn)線程同步,比那些重量級的鎖機(jī)制更加的節(jié)省消耗。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();北大青鳥中關(guān)村學(xué)士后本部北京市海淀區(qū)中關(guān)村大街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