多线程算法特别难于设计/调试/验证。 Dekker的算法是设计正确的同步算法有多困难的主要示例。 Tanenbaum的Modern操作系统在其IPC部分中提供了示例。有人为此提供良好的引用(书籍,文章)吗?谢谢!

最佳答案

没有保证人就不可能证明任何事情,因此,您要做的第一件事就是熟悉目标平台的内存模型。 Java和x86都有可靠的标准化内存模型-我不太确定CLR,但是如果其他所有方法都失败了,您将建立在目标CPU体系结构的内存模型上。该规则的异常(exception)是,如果您打算使用一种根本不允许任何共享的可变状态的语言-我听说过Erlang就是这样。

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

可以通过以下方法解决此问题:

  • 使状态不可变
  • 不共享状态
  • 通过同一锁保护共享的可变状态(两个不同的锁不能保护同一状态,除非您始终完全使用这两个锁)

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

    并发的第三个(也是更困难的)问题是锁定。错误管理的锁顺序是死锁的根源。您可以基于内存模型保证人来分析证明,代码中是否可能出现死锁。但是,您需要牢记这一点来设计和编写代码,否则代码的复杂性可能很快使这种分析在实践中无法执行。

    然后,一旦或在做之前,证明并发的正确使用,就必须证明单线程的正确性。并发代码库中可能发生的错误集等于单线程程序错误集,再加上所有可能的并发错误。

  • 10-06 05:06
    查看更多