行并程编难很。呃,再试一下,并行编程很难。

尽管这个例子有些滑稽,但是我输入的第一个句子确实能够反映我们开发人员在编写多线程代码的时候需要面对的一些典型问题。当我在写这篇序言的时候,我的两只正在笔记本电脑上打字的手实际上就是两个完全分开的物理进程。如果您更进一步,将我的每一根手指都考虑为一个独立的实体,那么就相当于有10个完全独立的进程。我是一个公认的打字快手,为了在每分钟内能输入100个以上的单词,我的大脑要设法协调我所有的手指,让它们能够并发地转移到下一个目标,然而还要确保手指的输出能够根据我脑中想要输入的内容的拼写方式进行串行化。在输入第一个句子时,我故意没有使用上述协调机制,这样我的手指就再也不能正确地同步了。这样做的结果就是我的想法很难以可读的方式表现出来。幸运的是,这种错误很容易调试。

并行编程实在是很难,至少从历史上来说一直是这样。利用一些可用的工具,只有少部分软件开发人员能够熟练掌握成功开发和调试多线程应用程序的技能。可是,随着现代计算机的出现,那些需要开发能够响应的用户界面、构建可扩展服务以及为了获得性能要利用多处理内核的开发人员们被迫要处理并发问题,被迫要在线程、互斥量和信号量的层次上开发软件。开发这些软件的困难在于:申请超额(oversubscription)、竞争条件(race condition)、死锁(deadlocks)、活锁(live lock)、二步舞(two-step dance)、优先级翻转(priority inversion)、锁封护(lock convoy)、伪共享(false sharing)等。

因为有这些复杂性的存在,再加上最近业界向多核和众核(manycore)转移的趋势,使得并行编程又受到了很多公司的重视,所以很多公司建立了开发平台,而Microsoft是这些公司中的领军者。好几年前,Microsoft的Parallel Computing Platform团队就以清晰的愿景和目标出现在了人们的面前:为了让并行软件的构建更加简单。应该让开发人员能够非常简单地表达存在于应用程序中的并行性,并且要让底层的框架、运行时和操作系统来为开发人员实现并行化,能够将开发人员表达出来的并行化映射到底层硬件,使其能够正确且高效地执行。Parallel Computing Platform团队的第一波并行支持组件是在2010年4月份作为Visual Studio 2010的一部分发布的。不论您使用的是原生代码还是托管代码,这一次发布的内容都提供了简化并行应用程序开发的基础组件。对于使用托管代码的开发人员来说,这一次发布的内容包括:Task Parallel Library、Parallel LINQ、新的Parallel Stacks调试窗口和Parallel Tasks调试窗口、能够让您深入查看多线程应用程序执行的Concurrency Visualizer,当然还有更多的精彩内容。

尽管有了这些工具的支持,并行编程仍然需要深入的知识。在这个以140个字符短语作为主要交流手段的年代里(特指微博),我个人认为一本高质量的书籍仍然是传播那些深奥知识的最佳载体。幸运的是,您现在就在阅读这样一本书。Gastón Hillar向大家呈现的是一本内容全面的书籍,涵盖了通过Visual Studio 2010和.NET Framework 4开发并行应用程序所涉及的方方面面。从基于任务的编程,到数据并行化、共享状态的管理以及并行程序的调试;从Task Parallel Library到Parallel LINQ、ThreadPool以及新的协调数据结构和同步原语。Gastón以深入浅出的方式为大家讲解了.NET Framework 4和Visual Studio 2010中对并行编程的广泛支持。

本书包含的内容可以帮助您获得开发并行应用程序所需的坚实基础知识。恭喜您已经已经跨入多核新世界的第一步了。

——Stephen Toub

微软并行编程平台首席项目经理

2010年9月

读书导航