多线程算法尤其难以设计/调试/证明。 Dekker 算法是一个很好的例子,说明设计正确的同步算法有多么困难。 Tanenbaum 的现代操作系统的 IPC 部分充满了示例。有人对此有很好的参考(书籍、文章)吗?谢谢!
如果没有保证,就不可能证明任何事情,因此您要做的第一件事就是熟悉目标平台的内存模型; Java 和 x86 都有可靠且标准化的内存模型 - 我不太确定 CLR,但如果其他方法都失败,您将构建目标 CPU 架构的内存模型。这条规则的例外是,如果你打算使用一种根本不允许任何共享可变状态的语言——我听说 Erlang 就是这样。
并发的第一个问题是共享可变状态。
这可以通过以下方式解决:
- 使状态不可变
- 不共享状态
- 保护共享的可变状态same锁(两个不同的锁不能保护同一个状态,除非你always正好使用这两个锁)
并发的第二个问题是安全发布。如何使数据可供其他线程使用?您如何进行移交?您将在内存模型中以及(希望)在 API 中找到此问题的解决方案。例如,Java 有多种发布状态的方法,并且 java.util.concurrent 包包含专门设计用于处理线程间通信的工具。
第三个(也是更难的)并发问题是锁定。锁排序管理不善是死锁的根源。您可以在内存模型保证的基础上分析证明代码中是否可能出现死锁。但是,您需要在设计和编写代码时牢记这一点,否则代码的复杂性会很快导致此类分析在实践中无法执行。
然后,一旦您证明了并发性的正确使用,或者在证明之前,您就必须证明单线程的正确性。并发代码库中可能发生的错误集合等于单线程程序错误集合加上所有可能的并发错误。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)