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