.NET 4.0中任務(wù)與線程關(guān)系談
原創(chuàng)【51CTO獨(dú)家特稿】雖然在.NET 4.0 Beta 1中支持并行擴(kuò)展的CTP(社區(qū)技術(shù)預(yù)覽)下很難在新的并行模式下調(diào)式代碼,但是并不難理解在并行循環(huán)中發(fā)生的事。之所以難以調(diào)試新的基于任務(wù)的程序代碼,最大的問題是CTP沒有為任務(wù)增加調(diào)試功能,IDE(Visual Studio 2008)只能用于調(diào)試線程,因此它無法正確調(diào)試任務(wù)。
如果你了解C風(fēng)格編碼,下面這行文字就是總結(jié)性描述:
- (Threads != Tasks) && (Thread != Task)
你可以在http://www.ddj.com/go-parallel/blog/archives/2009/06/find_john_fast.html;jsessionid=DP2HCMAT3F55PQE1GHRSKHWATMY32JVN查看由Cameron Hughes和Tracey Hughes特別處理過的圖,它們分成了七層進(jìn)行描述,從域模型層到硬件層,應(yīng)用程序任務(wù)層(第三層)位于邏輯任務(wù)層(第四層)和進(jìn)程/線程層(第五層)之上。
正如前面引用的圖所表示的意思,任務(wù)可以同時(shí)運(yùn)行在不同的層上,但都是由線程支持任務(wù)執(zhí)行的,因此任務(wù)要使用處理器時(shí)間從不同線程竊取工作,我已經(jīng)在我之前的文章“.NET 4.0 Beta 1和之前的版本中的工作竊取隊(duì)列”(原文鏈接:http://www.ddj.com/go-parallel/blog/archives/2009/06/work_stealing_q.html;jsessionid=TVDMASWBJE4GZQE1GHOSKHWATMY32JVN)中解釋了這一機(jī)制。
當(dāng)你使用任務(wù)工作時(shí),它們使用基本線程(軟件線程,在某些硬件線程或邏輯內(nèi)核上調(diào)度)運(yùn)行它們的代碼,但在任務(wù)和線程之間沒有一對(duì)一的關(guān)系,這就意味著不是每次創(chuàng)建任務(wù)時(shí)都會(huì)創(chuàng)建一個(gè)線程,CLR創(chuàng)造了必要的線程以支持任務(wù)的執(zhí)行需要,當(dāng)然,這是一個(gè)簡(jiǎn)化版本。
在使用基于任務(wù)的編程時(shí),你可以利用你已掌握的大部分技術(shù),但需要學(xué)習(xí)新的調(diào)試技術(shù),Visual Studio 2010雖然處于Beta 1階段,但仍然提供了兩個(gè)新的調(diào)試窗口:
◆并行堆棧
◆并行任務(wù)
這些新的窗口讓你可以理解正在運(yùn)行的任務(wù)與之相關(guān)的線程之間的關(guān)系,這樣你就可以調(diào)試基于任務(wù)的代碼,不會(huì)再遇到CTP測(cè)試期間發(fā)現(xiàn)的問題。
開始使用基于任務(wù)的算法編碼之前弄清楚任務(wù)和線程之間的差異是很重要的,新的調(diào)試窗口為開發(fā)人員提供了良好的信息理解并行循環(huán)和并行任務(wù)。
許多開發(fā)人員使用并行擴(kuò)展CTP,但沒有合適的調(diào)試器了解具體發(fā)生了什么,它們認(rèn)為任務(wù)難以控制,如果沒有這些新的調(diào)試窗口它們確實(shí)很難理解。
有句丹麥諺語說的好,“迅速執(zhí)行是好運(yùn)之母”,因此需要轉(zhuǎn)向使用基于任務(wù)并行編程!
原文名:Tasks Are Not Threads in .NET 4 Beta 1
作者:Gaston Hillar
【編輯推薦】