代码之家  ›  专栏  ›  技术社区  ›  Dan Tao

是什么导致了死锁或者并发测试不一致地失败?

  •  4
  • Dan Tao  · 技术社区  · 14 年前

    我一直在摆弄 CHESS ,这似乎是一个非常有用的工具。然而,具有讽刺意味的是,在我的一个测试方法中,我似乎正在处理一个海森堡。当我运行此测试时,CHESS报告的结果是不可预测的:

    • 有时考试会通过
    • 有时测试会失败,并指示复制*

    起初,我认为这种不一致性一定是因为测试涉及到 Random

    因此,我更新了测试,只需运行一组预定义的种子值(0到10)。线程本地 随机的 随机的 在锁里。代码看起来 基本上 确切地 这样地:

    Screenshot of CHESS reporting a deadlock

    更新 :我在.NET 3.5上运行此程序,因为CHESS仅支持VS 2008。我想知道这个问题是否与 this ?)

    sharedRandom 使用已知种子(介于0和10之间)初始化 localRandom Parallel.For 可能在运行之间有所不同,但在5次迭代中 平行。用于 ,同样的5粒种子应该用于 局部随机 ).

    就是这样 明白了。但是从国际象棋的结果来看,我倾向于相信我一定错过了什么。

    1. 上面的代码中是否有一个死锁,我太笨了,看不出来?
    2. 我不应该使用 在并发相关测试中初始化?
    3. 对于那些有使用国际象棋经验的人:它是一个可靠的工具吗?有时会出现假阳性吗?这实际上是一个很大的问题,好像这个场景很常见(测试结果不一致),那么我暂时暂缓使用象棋可能是明智的。

    *……我还没弄清楚怎么用——但这是另外一个问题。

    2 回复  |  直到 5 年前
        1
  •  1
  •   Hans Passant    14 年前

    我对国际象棋没有实际操作的经验,但我学得很好,知道你不能依赖它来给你可复制的测试结果。它发现线程问题的方法是非常统计的,在线程中注入随机延迟。设计来重现线程问题,这些问题受时间,特别是比赛条件的影响很大。

    威胁象棋作为一种诊断工具。如果它引起了一个标志,您可以相当肯定您有一个真正的,但仍然很难解决的线程问题。

        2
  •  1
  •   Dave Dunn    14 年前

    你可能想试试运气(www.corensic.com). Jinx不是生成报告,而是改变各种cpu的有效性能。所以不会产生假阳性。

    如果小样本在Jinx下死锁,那么它肯定能够在正常使用期间死锁。假设它发生死锁,您应该能够使用visualstudio打破死锁并查看线程的位置。

    免责声明。我为你工作 corensic

    推荐文章