【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
【编辑推荐】