Multi-Core and Concurrency - Languages, Libraries and Development Techniques
CPU架构的格局已经改变,多核是一种趋势,它将改变我们开发软件的方式。我已经在C、C++和Java中做了多线程开发,我使用各种IPC机制完成了多进程开发。对于开发人员来说,使用线程的传统方法似乎并不容易使用支持高度并发性的硬件。
您知道哪些语言、库和开发技术有助于减轻创建并发应用程序的传统挑战?很明显,我在考虑僵局和比赛条件等问题。设计技术、库、工具等也很有趣,它们有助于实际利用并确保可用资源得到利用——仅仅编写一个安全、健壮的线程应用程序并不能确保它使用所有可用的核心。
到目前为止,我看到的是:
- Erlang:基于进程的消息传递IPC,并发的"参与者模型"
- 剧作家:鲁比和Python的演员模型库
- scala:jvm的函数编程语言,增加了一些并发支持
- Clojure:带有actors库的JVM的函数式编程语言
- 白蚁:二郎进程方法的一个端口和传递到方案的消息
你还知道什么,什么对你有效,你认为什么是有趣的观看?
我建议两种模式转变:
软件事务内存您可能想看看软件事务性内存(STM)的概念。其思想是使用乐观并发:任何与其他操作并行运行的操作都试图在一个孤立的事务中完成其作业;如果在某个时刻提交了另一个事务,使该事务所处理的数据无效,则该事务的工作将被丢弃,而该事务将再次运行。
我认为这个想法的第一个广为人知的实现(如果不是概念证明和第一个)是Haskell中的一个:关于Haskell中事务性内存的论文和演示。维基百科的STM文章列出了许多其他实现。
事件循环和承诺另一种处理并发性的非常不同的方法是在[e编程语言]中实现(http://en.wikipedia.org/wiki/e_u(编程语言%29)。
注意,它处理并发性的方式以及语言设计的其他部分在很大程度上是基于参与者模型的。
您提到了Java,但您只提到线程。你看过Java的并发库吗?它与Java 5及以上捆绑在一起。
它是一个非常好的库,包含线程池、copyonwritecollections等等。在Java教程中查看文档。或者,如果你喜欢,Java文档。
一些基于scala的东西:
- pilib:一种pi微积分式并发的托管语言
- 无控制反转的基于事件的程序设计
- 统一线程和事件的参与者
- scala多播参与者:体系结构和实现
- 使用可扩展模式匹配实现连接
- 沟通scala对象(修订版)
我已经使用了Python的处理。它模仿线程模块的API,因此非常容易使用。
如果您碰巧使用
1 2 3 4 | def do_something(x): return x**(x*x) results = [do_something(n) for n in range(10000)] |
可以与
1 2 3 | import processing pool = processing.Pool(processing.cpuCount()) results = pool.map(do_something, range(10000)) |
它将使用多少处理器来计算结果。还有懒惰(
有一个实现
我在ADA做并发编程已经有近20年了。
语言本身(不是一些附加的库)支持线程("任务")、多个调度模型和多个同步范例。甚至可以使用内置原语构建自己的同步方案。
您可以将ADA的集合视为一种面向过程的同步工具,而受保护对象则更面向对象。会合点类似于旧的CS监视器概念,但功能更强大。受保护对象是具有同步原语的特殊类型,它允许您完全构建操作系统锁、信号灯、事件等内容。但是,它的功能足够强大,您还可以根据您的具体需要创建自己的类型的同步对象。
问题是,您今天推荐什么并行编程模型来利用明天的许多处理器?已经问过了。我也给出了下面的答案。
Kamaelia是一个用于构建具有许多通信过程的应用程序的Python框架。
Kamaelia - Concurrency made useful, fun
In Kamaelia you build systems from simple components that talk to each other. This speeds development, massively aids maintenance and also means you build naturally concurrent software. It's intended to be accessible by any developer, including novices. It also makes it fun :)
What sort of systems? Network servers, clients, desktop applications, pygame based games, transcode systems and pipelines, digital TV systems, spam eradicators, teaching tools, and a fair amount more :)
这是Pycon 2009的视频。它首先将kamaelia与扭曲和平行的python进行比较,然后给出kamaelia的实际演示。
与Kamaelia的简单并发性.第1部分(59:08)与Kamaelia的简单并发性.第2部分(18:15)
我会说:
模型:线程+共享状态,参与者+消息传递,事务性内存,映射/减少?语言:Erlang、IO、Scala、Clojure、Reia图书馆:retlang、jetlang、kilim、cilk++、fork/join、mpi、kamaelia、terracotta
我保持一个并发链接博客关于这样的东西(Erlang,斯卡拉,Java线程,演员模型等),并提出了一对夫妇链接一天:
http://concurrency.tumblr.com
对于英特尔来说,英特尔的线程构建块看起来很有趣。它提供了比原始线程更高的抽象级别。如果你喜欢死树文档,奥雷利有一本非常好的书。另外,还看到英特尔线程构建块的经验吗?.
我正在密切关注.NET和Parallel Linq的并行扩展。
C++ 0x将提供用于锁定多个互斥体的EDCOX1×0函数。这将有助于缓解由于无序锁定而导致的死锁。此外,C++0x线程库将具有承诺、期货和打包任务,这允许线程等待另一线程上执行的操作的结果而无任何用户级锁。
OpenMP
它为您处理线程,因此您只担心要并行运行C++应用程序的哪些部分。
如。
1 2 3 4 5 | #pragma omp parallel for for (int i=0; i < SIZE; i++) { // do something with an element } |
上面的代码将在您告诉OpenMP运行时要使用的线程上运行for循环,因此如果大小为100,并且您有一个四核盒,那么for循环将在每个核心上运行25个项目。
对于各种语言还有一些其他的并行扩展,但我最感兴趣的是那些运行在图形卡上的扩展。这是真正的并行处理:)(示例:gpu++和libsh)
你知道,Java也有演员库。你知道Java是一种功能语言吗?;)
这个问题与您今天推荐的利用明天的许多核心处理器的并行编程模型密切相关(如果不是重复的话)?
我知道reia——一种基于erlang的语言,但看起来更像python/ruby。
用python的
因此,这是一个教训:当选择一个多核库时,人们可能会问云方法是否也有意义。