通用语言运行时(Common Language Runtime,CLR)以锁、线程和线程池的形式为并行编程提供基本的支持。不过,随着多核 CPU 重要性的逐步增加,大家又重燃构建高级并行编程函数库的热情。
很多人现在都投身于函数式编程的世界,由于它们具有不可变的对象,以及与生俱来的线程安全属性。基于 F#语言的 Haskell 和 OCaml 可以归入此类。其他例如 Erlang 这样倍受大家偏爱的语言,是基于消息传递和轻量级进程的。除了支持 F#外,微软也尝试了几种不同的方式,以需求并行编程的准确提炼。
最先公布的产品是并行 LINQ( Parallel LINQ ),也即所谓的 PLINQ。类似对 SQL 的处理一样,并行的版本通过语言本身来处理,而无需开发人员的努力。通过把 AsParallel 附加到查询上,就能正常工作了。不过正如 SQL 一样,在这里通常还是需要设定很多额外的选项。
下一个出现的是结构化并行性语法( Structured Parallelism ),这种技术会让人想起 OpenMP。不过它不像 OpenMP 那样,使用编译器指令标记;微软的解决方案是基于匿名委托。最直观的反应就是代码只需作细微的修改;在“for”语句内的代码块,可以作为参数传递到“Parallel.For”函数中。
如果代码无法轻易地表示为查询或迭代循环,则可以选择任务并行库( Task Parallel Library )。乍看之下,它似乎是另外一种线程池,但它却支持任务之间的父子关系。
为了对应用程序进行更好地控制,微软提供了协调一致的数据结构( Coordination Data Structures )。它们为未来提供了线程安全的集合以及改良过的同步对象。
评论