证明多线程算法的正确性

时间:2008-09-16 16:44:51

标签: algorithm multithreading theory correctness proof

多线程算法特别难以设计/调试/证明。 Dekker的算法是设计正确的同步算法有多么困难的一个主要例子。 Tanenbaum的现代操作系统在其IPC部分中充满了示例。有没有人有这方面的好参考(书籍,文章)?谢谢!

6 个答案:

答案 0 :(得分:13)

如果不建立guarentees,就不可能证明任何事情,所以你要做的第一件事就是熟悉目标平台的内存模型; Java和x86都有可靠和标准化的内存模型 - 我对CLR不太确定,但如果其他所有方法都失败了,那么你将建立在目标CPU架构的内存模型上。此规则的例外情况是,如果您打算使用一种不允许任何共享可变状态的语言 - 我听说过Erlang就是这样。

并发的第一个问题是共享可变状态。

可以通过以下方式解决:

  • 使状态不可变
  • 不分享州
  • 通过相同的锁保护共享的可变状态(两个不同的锁无法保护同一个状态,除非总是正好使用这两个锁)

并发的第二个问题是安全发布。如何将数据提供给其他线程?你是如何进行移交的?您将在内存模型中解决此问题,并且(希望)在API中。例如,Java有很多发布状态的方法,java.util.concurrent包中包含专门用于处理线程间通信的工具。

并发的第三个(也是更难的)问题是锁定。错误管理的锁定顺序是死锁的来源。您可以通过分析证明,在内存模型guarentees的基础上,您的代码中是否可以使用死锁。但是,您需要在设计和编写代码时考虑到这一点,否则代码的复杂性会很快导致无法在实践中执行此类分析。

然后,一旦你有,或在你做之前,证明正确使用并发,你将必须证明单线程的正确性。并发代码库中可能出现的错误集等于单线程程序错误集,以及所有可能的并发错误。

答案 1 :(得分:3)

答案 2 :(得分:3)

“并发和分布式编程原理”,M。Ben-Ari ISBN-13:978-0-321-31283-9
他们在线阅读野生动物园书籍以供阅读:
http://my.safaribooksonline.com/9780321312839

答案 3 :(得分:2)

简短回答:这很难。

从上世纪80年代后期开始,DEC SRC Modula-3和落叶松的东西确实很不错。

e.g。

Modula-3的一些好主意正在进入Java世界,例如: JML虽然“JML目前仅限于顺序规范”,但intro表示。

答案 4 :(得分:1)

我没有任何具体的参考资料,但您可能想要了解Owicki-Gries理论(如果您喜欢定理证明)或过程理论/代数(其中还有各种模型检查工具可用)。

答案 5 :(得分:0)

@以防万一:我是。但是从我学到的东西来看,对于一个非平凡的算法这样做是一个很大的痛苦。我为那些聪明的人留下了那样的东西。我从Parallel Program Design:A Foundation(1988)中学到了我的知识。 作者:K M Chandy,J Misra