多线程算法特别难以设计/调试/证明。 Dekker的算法是设计正确的同步算法有多么困难的一个主要例子。 Tanenbaum的现代操作系统在其IPC部分中充满了示例。有没有人有这方面的好参考(书籍,文章)?谢谢!
答案 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。
Thread synchronization: A formal specification(1991) 作者:A D Birrell,J V Guttag,J J Horning,R Levin 使用Modula-3进行系统编程,第5章
Extended static checking(1998) 作者:David L. Detlefs,David L. Detlefs,K。Rustan,K。Rustan,M。Leino,M。Leino,Greg Nelson,Greg Nelson,James B. Saxe,James B. Saxe
Modula-3的一些好主意正在进入Java世界,例如: JML虽然“JML目前仅限于顺序规范”,但intro表示。
答案 4 :(得分:1)
我没有任何具体的参考资料,但您可能想要了解Owicki-Gries理论(如果您喜欢定理证明)或过程理论/代数(其中还有各种模型检查工具可用)。
答案 5 :(得分:0)
@以防万一:我是。但是从我学到的东西来看,对于一个非平凡的算法这样做是一个很大的痛苦。我为那些聪明的人留下了那样的东西。我从Parallel Program Design:A Foundation(1988)中学到了我的知识。 作者:K M Chandy,J Misra