代码之家  ›  专栏  ›  技术社区  ›  Tony The Lion

一个多线程程序可以是确定性的吗?

  •  7
  • Tony The Lion  · 技术社区  · 14 年前

    通常,多线程程序是不确定的,这意味着如果它崩溃,几乎不可能重新创建导致这种情况的错误。人们永远不知道下一个线程将运行什么,以及何时它将被再次抢占。

    当然,这与操作系统线程调度算法有关,而且人们不知道下一个线程将运行什么,以及它将有效运行多长时间。

    但是,如果你有用于线程调度的算法,如果你能知道什么线程在运行,那么多线程程序会变成“确定性”吗?比如,你能重现崩溃吗?

    7 回复  |  直到 10 年前
        1
  •  12
  •   tshepang Arrie    10 年前

    了解算法实际上并不能让你预测什么时候会发生什么。程序或线程执行过程中发生的各种延迟都取决于环境条件(空闲RAM->交换、其他繁忙任务、中断等)。

    如果要将多线程程序映射到一个顺序执行,并且线程本身的行为是确定性的,那么整个程序可能是确定性的,“并发”问题可能是可复制的。当然,到那时它们就不再是并发问题了。

    http://en.wikipedia.org/wiki/Process_calculus 这本书很有趣。

        2
  •  6
  •   Andrey    14 年前

    不确定性 .

        3
  •  3
  •   Henk Holterman    14 年前

    有一些工具(正在开发中)将尝试以某种可预测的方式创建竞争条件,但这是关于前瞻性测试,而不是关于重建“野外bug”。

    CHESS 这就是一个例子。

        4
  •  3
  •   tshepang Arrie    10 年前

        5
  •  0
  •   Joe    14 年前

    多线程程序中的大量崩溃与多线程本身(或相关的资源争用)无关。

        6
  •  0
  •   João Matos    9 年前

    我认为这是不可行的。为了执行特定的线程交错,我们需要在共享变量上设置锁,强制线程按特定顺序访问它们。这将导致性能严重下降。

    回放并发错误通常由记录和回放系统来处理。由于记录如此大量的信息也会降低性能,因此最新的系统会进行部分日志记录,然后使用SMT解决方法完成线程交错。我相信这种系统的最新进展是Symbiosis(发表在今年的PLDI会议上)。您可以在以下URL中找到开源实现:

    http://www.gsd.inesc-id.pt/~nmachado/software/Symbiosis_Tutorial.html

        7
  •  -1
  •   Chris O    14 年前

    通常,多线程程序是不确定的,这意味着如果它崩溃,几乎不可能重新创建导致这种情况的错误。

    推荐文章