版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
工業(yè)和信息化部“十二五”規(guī)劃教材
普通高等學(xué)校“十二五”規(guī)劃教材
《C#網(wǎng)絡(luò)應(yīng)用編程》第3版
第6章并行編程2Ch6并行編程6.1基本概念6.2Parallel類及其幫助器類6.3數(shù)據(jù)并行6.4任務(wù)并行6.1基本概念6.1.1并行編程的實(shí)現(xiàn)方式6.1.2任務(wù)并行庫(TPL)及其分類6.1.3并行編程中的分區(qū)(Partitioner)46.1.1并行編程的實(shí)現(xiàn)方式1.從業(yè)務(wù)實(shí)現(xiàn)的角度看并行策略并行編程模型分為數(shù)據(jù)并行與任務(wù)并行2.從硬件實(shí)現(xiàn)的角度看并行策略并行又分為單機(jī)多核并行和多機(jī)多核并行。6.1.2任務(wù)并行庫(TPL)及其分類1.TPL的分類(1)數(shù)據(jù)并行(2)任務(wù)并行(3)并行查詢6.1.2任務(wù)并行庫(TPL)及其分類2.TPL與傳統(tǒng)多線程編程模型相比的優(yōu)勢(1)TPL編程模型使用CLR線程池執(zhí)行多個(gè)任務(wù),并能自動(dòng)處理工作分區(qū)、線程調(diào)度和取消、狀態(tài)管理以及其他低級別的細(xì)節(jié)操作。(2)TPL還會(huì)動(dòng)態(tài)地按比例調(diào)節(jié)并發(fā)程度,從而最有效地使用所有可用的處理器。(3)TPL比Thread更具智能性,當(dāng)它通過試探法來預(yù)判任務(wù)集不會(huì)從并行運(yùn)行中獲得性能優(yōu)勢時(shí),還會(huì)自動(dòng)選擇按順序運(yùn)行。6.1.2任務(wù)并行庫(TPL)及其分類3.并行編程建議的做法并非所有的任務(wù)都適合并行。這里特別強(qiáng)調(diào)的是,不論是數(shù)據(jù)并行、任務(wù)并行還是并行查詢,在實(shí)際項(xiàng)目中都不應(yīng)該在并行循環(huán)的內(nèi)部頻繁地和界面交互,這是因?yàn)轭l繁地調(diào)用共享資源(如界面控件、控制臺或文件系統(tǒng))會(huì)大幅降低并行循環(huán)的性能。6.1.3并行編程中的分區(qū)(Partitioner)1.按范圍分區(qū)按范圍分區(qū)適用于已經(jīng)知道長度的數(shù)據(jù)源。2.按區(qū)塊分區(qū)對于長度未知的鏈接列表或其他集合,可以使用按區(qū)塊分區(qū)。3.動(dòng)態(tài)分區(qū)即可以隨時(shí)創(chuàng)建分區(qū)。4.自定義分區(qū)程序若要?jiǎng)?chuàng)建自定義分區(qū)程序,可從System.Collections.Concurrent.Partitioner<TSource>派生一個(gè)類并重寫虛方法。6.2Parallel類及其幫助器類6.2.1Parallel類6.2.2Parallel幫助器類6.2.3用于線程全局變量的數(shù)據(jù)結(jié)構(gòu)6.2.1Parallel類1.Parallel.For方法Parallel.For方法用于并行執(zhí)行for循環(huán)。靜態(tài)的For方法有12種重載形式(6種32位重載,6種64位重載)For(Int32,Int32,Action<Int32>)For(Int32,Int32,ParallelOptions,Action<Int32>)For(Int32,Int32,Action<Int32,ParallelLoopState>)For(Int32,Int32,ParallelOptions,Action<Int32,ParallelLoopState>)For<TLocal>(Int32,Int32,Func<TLocal>,Func<Int32,ParallelLoopState,TLocal,TLocal>,Action<TLocal>)For<TLocal>(Int32,Int32,ParallelOptions,Func<TLocal>,Func<Int32,ParallelLoopState,TLocal,TLocal>,Action<TLocal>)一般形式如下:Parallel.For(<開始索引>,<結(jié)束索引>,<每次迭代執(zhí)行的委托>)6.2.1Parallel類2.Parallel.ForEach方法(1)在IEnumerable上并行(2)在Partitioner中并行(3)在OrderablePartitioner中并行(4)具有線程本地?cái)?shù)據(jù)的并行6.2.1Parallel類3.Parallel.Invoke方法Parallel.Invoke方法用于任務(wù)并行。重載形式有:Invoke(Action[])Invoke(ParallelOptions,Action[])這兩種方式都是盡可能并行執(zhí)行提供的操作,采用第二種重載形式還可以取消操作。6.2.2Parallel幫助器類ParallelOptionsParallelLoopStateParallelLoopResultCancellationToken和CancellationTokenSource。6.2.2Parallel幫助器類1.ParallelOptions類ParallelOptions類用于為Parallel類的方法提供操作選項(xiàng),常用屬性如下。CancellationToken:獲取或設(shè)置與此ParallelOptions實(shí)例關(guān)聯(lián)的CancellationToken。MaxDegreeOfParallelism:獲取或設(shè)置此ParallelOptions實(shí)例所允許的最大并行度,即限制將使用多少并發(fā)任務(wù)。TaskScheduler:獲取或設(shè)置與此ParallelOptions實(shí)例關(guān)聯(lián)的任務(wù)調(diào)度策略,null表示應(yīng)使用當(dāng)前調(diào)度程序。6.2.2Parallel幫助器類2.ParallelLoopState類ParallelLoopState類用于將Parallel循環(huán)的迭代與其他迭代交互。該類的實(shí)例由Parallel類來提供給每個(gè)循環(huán),而不是在代碼中直接創(chuàng)建該類的實(shí)例。常用屬性和方法如下。IsExceptional屬性:獲取循環(huán)過程中某個(gè)迭代是否出現(xiàn)了未處理的異常。IsStopped屬性:獲取循環(huán)過程中某個(gè)迭代是否已調(diào)用了Stop方法。Break方法:告知Parallel循環(huán)應(yīng)盡早停止執(zhí)行當(dāng)前迭代之外的迭代。Stop方法:告知Parallel循環(huán)應(yīng)盡早停止執(zhí)行。6.2.2Parallel幫助器類3.ParallelLoopResult類ParallelLoopResult類用于提供Parallel循環(huán)的完成狀態(tài),常用屬性如下。IsCompleted:獲取該循環(huán)是否已運(yùn)行完成(即該循環(huán)的所有迭代均已執(zhí)行,并且該循環(huán)沒有收到提前結(jié)束的請求)。LowestBreakIteration:獲取從中調(diào)用Break的最低迭代的索引。如果IsCompleted返回true,則表示所有迭代都完成。如果IsCompleted返回false,并且LowestBreakIteration返回非null值,表示用Stop提前結(jié)束了循環(huán)。如果IsCompleted返回false,并且LowestBreakIteration返回非null整數(shù)值,表示用Break提前結(jié)束了循環(huán)。6.2.2Parallel幫助器類4.CancellationToken類和CancellationTokenSource類該類的含義及用法在基于任務(wù)的異步編程中已經(jīng)介紹過。6.2.3用于線程全局變量的數(shù)據(jù)結(jié)構(gòu)1.基本概念線程全局變量、線程局部變量、字段、局部變量之間的區(qū)別和聯(lián)系如下。線程全局變量可能是字段,也可能是局部變量,但字段和局部變量不一定是線程全局變量。只有當(dāng)變量所在的代碼段通過Parallel類在線程池中運(yùn)行并可供多個(gè)并發(fā)的線程共享時(shí),這些變量才稱為線程全局變量。線程局部變量肯定是局部變量,但局部變量不一定是線程局部變量。只有在并行迭代循環(huán)體內(nèi)定義的局部變量才稱為線程局部變量。6.2.3用于線程全局變量的數(shù)據(jù)結(jié)構(gòu)2.用volatile關(guān)鍵字或者原子操作實(shí)現(xiàn)對于單個(gè)數(shù)據(jù)(如int、double、string等類型的數(shù)據(jù)),當(dāng)將其作為線程全局變量使用時(shí),可利用volatile關(guān)鍵字將其作為字段來解決同步和沖突問題,或者利用原子操作(Interlocked類提供的靜態(tài)方法)來解決。6.2.3用于線程全局變量的數(shù)據(jù)結(jié)構(gòu)3.用并發(fā)集合類實(shí)現(xiàn)(1)ConcurrentBag<T>(2)隊(duì)列、堆棧和字典ConcurrentQueue<T>ConcurrentStack<T>ConcurrentDictionary<TKey,TValue>6.3數(shù)據(jù)并行6.3.1利用Parallel.For方法實(shí)現(xiàn)數(shù)據(jù)并行6.3.2利用Parallel.ForEach方法實(shí)現(xiàn)數(shù)據(jù)并行6.3.1利用Parallel.For方法實(shí)現(xiàn)數(shù)據(jù)并行1.簡單的Parallel.For循環(huán)For(Int32,Int32,Action<Int32>)6.3.1利用Parallel.For方法實(shí)現(xiàn)數(shù)據(jù)并行2.帶并行選項(xiàng)的Parallel.For循環(huán)For(Int32,Int32,ParallelOptions,Action<Int32>)6.3.1利用Parallel.For方法實(shí)現(xiàn)數(shù)據(jù)并行3.帶并行循環(huán)狀態(tài)的Parallel.For循環(huán)For(Int32,Int32,Action<Int32,ParallelLoopState>)6.3.1利用Parallel.For方法實(shí)現(xiàn)數(shù)據(jù)并行4.帶線程局部變量的Parallel.For循環(huán)For<TLocal>(Int32,Int32,Func<TLocal>,Func<Int32,ParallelLoopState,TLocal,TLocal>,Action<TLocal>)6.3.2利用Parallel.ForEach方法實(shí)現(xiàn)數(shù)據(jù)并行1.簡單的Parallel.ForEach循環(huán)ForEach<TSource>(IEnumerable<TSource>,Action<TSource>)6.3.2利用Parallel.ForEach方法實(shí)現(xiàn)數(shù)據(jù)并行2.通過按范圍分區(qū)加快小型循環(huán)體的速度使用Partitioner的靜態(tài)Create方法對源元素創(chuàng)建按范圍分區(qū)的IEnumerable<T>,然后將此范圍集合傳遞給由常規(guī)for循環(huán)組成的ForEach方法的循環(huán)體。6.4任務(wù)并行6.4.1Parallel.Invoke方法6.4.2任務(wù)調(diào)度6.4.3任務(wù)等待與組合6.4.1Parallel.Invoke方法publicstaticvoidInvoke(Action[]actions)publicstaticvoidInvoke(ParallelOptionsparallelOptions,Action[]actions)6.4.1Parallel.Invoke方法6.4.2任務(wù)調(diào)度1.默認(rèn)的調(diào)度程序(1)ThreadPool的全局隊(duì)列和本地隊(duì)列每個(gè)線程池都有一個(gè)全局隊(duì)列,該隊(duì)列負(fù)責(zé)按先進(jìn)先出(FIFO)方式將頂級任務(wù)(即不是在另一個(gè)任務(wù)的上下文中創(chuàng)建的任務(wù))添加到該隊(duì)列中進(jìn)行排隊(duì)。添加到全局隊(duì)列中的任務(wù)默認(rèn)會(huì)安排到不同的多個(gè)可用處理器(多核處理器)上去執(zhí)行。對于子任務(wù)或者嵌套任務(wù),這些任務(wù)都將放入一個(gè)按后進(jìn)先出(LIFO)方式操作的本地隊(duì)列中,此時(shí)該隊(duì)列的“父任務(wù)”是指在該線程的父級線程上執(zhí)行的線程。這樣做的好處是既可以保留緩存的資源位置,又能減少資源的爭用情況。(2)工作竊取6.4.2任務(wù)調(diào)度2.自定義任務(wù)調(diào)度程序(1)TaskCreationOptions枚舉NoneAttachedToParentDenyChildAttachHideSchedulerLongRunningPreferFairness(2)長時(shí)間運(yùn)行的任務(wù)6.4.2任務(wù)調(diào)度3.任務(wù)工廠TaskFactory類和TaskFactory<TResult>類6.4.2任務(wù)調(diào)度3.任務(wù)工廠任務(wù)工廠的設(shè)計(jì)思路是用基于事件的異步編程技術(shù)去解決各種應(yīng)用程序中的沖突和兼容性問題,而不是用基于任務(wù)的異步模式去實(shí)現(xiàn)的。從.NET框架4.5開始,凡是任務(wù)工廠提供的功能,建議都通過基于任務(wù)的編程模型去實(shí)現(xiàn)6.4.3任務(wù)等待與組合1.等待一個(gè)或多個(gè)任務(wù)完成(1)Wait方法
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024版全新水電工程承包合同權(quán)利與義務(wù)
- 2025年度體育用品代工生產(chǎn)合同模板(專業(yè)運(yùn)動(dòng)系列)4篇
- 2025年度特色農(nóng)家樂經(jīng)營權(quán)轉(zhuǎn)讓合同范本4篇
- 2024綠色能源項(xiàng)目開發(fā)與合作合同
- 2024租賃合同租金計(jì)算方式
- 2024運(yùn)輸及代收款合同
- 鋼質(zhì)機(jī)動(dòng)貨船修造行業(yè)深度研究報(bào)告
- 2025年度個(gè)人知識產(chǎn)權(quán)質(zhì)押反擔(dān)保合同模板4篇
- 2025年個(gè)人網(wǎng)絡(luò)安全技術(shù)入股合作協(xié)議4篇
- 2025年云南基投資源開發(fā)有限公司招聘筆試參考題庫含答案解析
- DB33T 2570-2023 營商環(huán)境無感監(jiān)測規(guī)范 指標(biāo)體系
- 上海市2024年中考英語試題及答案
- 房屋市政工程生產(chǎn)安全重大事故隱患判定標(biāo)準(zhǔn)(2024版)宣傳海報(bào)
- 垃圾車駕駛員聘用合同
- 2025年道路運(yùn)輸企業(yè)客運(yùn)駕駛員安全教育培訓(xùn)計(jì)劃
- 南京工業(yè)大學(xué)浦江學(xué)院《線性代數(shù)(理工)》2022-2023學(xué)年第一學(xué)期期末試卷
- 2024版機(jī)床維護(hù)保養(yǎng)服務(wù)合同3篇
- 《論拒不執(zhí)行判決、裁定罪“執(zhí)行能力”之認(rèn)定》
- 工程融資分紅合同范例
- 2024國家安全員資格考試題庫加解析答案
- 通信工程建設(shè)標(biāo)準(zhǔn)強(qiáng)制性條文匯編(2023版)-定額質(zhì)監(jiān)中心
評論
0/150
提交評論