Erlang在哪些方面可以防止并发编程中的竞争条件?


11

阅读有关Erlang的并发信息,使我想起了Akka并发工具包。两者都为您提供了预防或限制比赛条件的工具。但是您可以使用Akka工具包将可变数据的链接发送到其他进程,这仍然是不安全的。我认为Akka是一种有用的工具,但它不能防止对对象和数据的乱序访问,从而导致竞争情况,死锁和/或饥饿。它并不能阻止您以Java或C#保护您免于编写可以在C ++中编写的大多数类型的内存泄漏的方式编写不安全的代码(您仍然可以通过欺骗垃圾收集器来在Java中创建内存泄漏,但是这种情况较少而不是必须记住释放分配的每个字节)。

Erlang是否在并发编程中保证一定程度的正确性,性能和鲁棒性?我认为操作系统在访问系统资源时会提供保护(假设驱动程序编写者的工作做得很好)。ACID数据库为读取和更新提供保护。因此,这似乎是一个可解决的问题。还是通用安全解决方案会消除并发性带来的性能提升?其他语言或工具包是否提供Erlang提供(或不提供)的并发安全性?

这是@Malfist对@ user1249的回答的评论的后续问题,即哪种编程语言生成最少的难以发现的错误?

Answers:


19

Erlang有一些事情可以帮助您解决这些问题。

  • 数据是不可变的,因此没有数据竞争
  • OTP gen_servers和gen_fsm为服务器提供了经过良好测试的模式
  • 主管允许从崩溃中恢复
  • 流程小而便宜
  • 内存是按进程分配的(没有GC冻结)
  • erlang VM经过优化,可以在非常重的负载下工作
  • 软件可以即时更新,因此无需停机

这里最主要的是,在Erlang中,没有共享状态可能需要锁定,因此不需要锁定。对于不需要停机,高容错性和并发性的软实时应用而言,这是一种出色的语言


12
@JarrodRoberson:实际上,要点是没有共享的可变状态。如果不进行突变,则共享状态没有问题。如果您不共享可变状态,那就没问题了。
约尔格W¯¯米塔格

1
还有一个新工具Concuerror youtube.com/watch?v=FpkjKN9wTKg,可让您使用所有可能的事件顺序运行测试
Zachary K,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.