创建并发应用程序至少有三种众所周知的方法:
通过锁定进行多线程和内存同步(.NET,Java)。软件事务内存(link text)是另一种同步方法。
异步消息传递(Erlang)。
我想了解是否有其他方法,并讨论应用于大型分布式应用程序的这些方法的各种优缺点。我主要关注的是简化程序员的生活。
例如,在我看来,当它们之间没有依赖关系时,使用多个线程很容易,这是非常罕见的。在所有其他情况下,线程同步代码变得非常麻烦,难以调试和推理。
答案 0 :(得分:8)
我强烈建议您看看Rich Hickey的this presentation。它描述了构建高性能并发应用程序的方法,我认为这与基于锁定或消息传递的设计不同。
基本上它强调:
并讨论这些原则如何影响Clojure语言的设计。
答案 1 :(得分:5)
阅读Herb Sutter的Effective Concurrency专栏,您也将受到启发。
答案 2 :(得分:2)
使用Java 5并发API,只要您利用高级实用程序并正确使用它们,在Java中进行并发编程就不一定非常麻烦和困难。我发现Brian Goetz的书“Java Concurrency in Practice”是一本关于这个主题的精彩读物。在我上一份工作中,我使用了本书中的技术,使一些图像处理算法可以扩展到多个CPU并管理CPU和磁盘绑定任务。我发现这是一次很棒的体验,我们取得了很好的成绩。
或者如果您使用的是C ++,您可以尝试使用#pragma指令使循环并行,但我自己从未使用过它。
答案 3 :(得分:1)
在Erlang and OTP in Action中,作者提出了四种过程交流范式:
带锁的共享内存
构造( lock )用于 限制对共享资源的访问。 通常需要硬件支持 从内存系统来讲 特殊说明。这种方法可能存在的缺点包括:开销,内存系统争用点,调试难度,尤其是大量进程。
软件交易记忆
将内存视为数据库, 其中交易决定做什么 写和何时。这里的主要问题 由可能的代表 争论和数量 交易尝试失败。
期货,承诺和类似的
基本思想是 future 是一个 已经计算的结果 外包给不同的流程 (可能在不同的CPU或 机器),这可以传递 像任何其他对象一样。的情况下 可能会出现网络故障问题。
消息传递
同步或异步,in Erlang风格。