线程代码的详尽测试

时间:2017-09-05 15:38:22

标签: c++ c multithreading unit-testing open-source

是否存在开源技术来模拟所有可能的内存访问排序排列,以详尽地单元测试线程C或C ++代码?

备注和示例

一个答案是:“使用内存安全/功能/非常高级的语言。避免使用C和C ++。”但是,这个答案回答了另一个问题。 Rust,Go,Erlang,Haskell等都很棒;但我的问题是关于无约束的C,C ++,汇编等。

另一个答案是:“使用futurepromise等来避免这个问题。”但是,我的问题是关于测试方法,而不是编码方法。我不寻求代码来帮助我满足范式,而是寻求帮助我测试代码的范例(或工具)。

Linux内核的源文档中的文件 memory-barriers.txt 提供了一个合适的示例:

  

[C]考虑以下事件序列:

    CPU 1           CPU 2
    =============== ===============
    { A == 1; B == 2 }
    A = 3;          x = B;
    B = 4;          y = A;
  

中间存储系统看到的访问集可以按24种不同的组合排列:

    STORE A=3,      STORE B=4,      y=LOAD A->3,    x=LOAD B->4
    STORE A=3,      STORE B=4,      x=LOAD B->4,    y=LOAD A->3
    STORE A=3,      y=LOAD A->3,    STORE B=4,      x=LOAD B->4
    STORE A=3,      y=LOAD A->3,    x=LOAD B->2,    STORE B=4
    STORE A=3,      x=LOAD B->2,    STORE B=4,      y=LOAD A->3
    STORE A=3,      x=LOAD B->2,    y=LOAD A->3,    STORE B=4
    STORE B=4,      STORE A=3,      y=LOAD A->3,    x=LOAD B->4
    STORE B=4, ...
    ...
  

因此可以产生四种不同的值组合:

    x == 2, y == 1
    x == 2, y == 3
    x == 4, y == 1
    x == 4, y == 3

不是等待Heisenbug出现,对于像上面这样的简单代码,人们宁愿只提前模拟所有24个案例。是否存在开源技术来模拟24个案例?

如果该技术不存在,那么它可能存在吗?或者组合爆炸会使这种技术在实践中变得无用吗?如果是后者,那么训练有素的C ++程序员如何在编码时获得最大性能的单元测试线程逻辑呢?

各种作者都警告说,对并发思考是多么困难。如果存在的话,在具体情况下系统地暴露潜在故障的开源技术或工具将有所帮助。是吗?

参考

  • 存在this answer,但它已经七岁了,无论如何都没什么帮助。
  • 也存在these answers,但它们一样旧,不考虑开源。
  • Here是一个不够精确的问题。
  • Here是一个非常有趣的问题,有各种部分答案,但它已经九岁了。(当时没有人真的有答案,显然。)
  • Here是指至少了解问题的异地人员。
  • Java现场存在各种问题和答案,但Java并不是我所要求的。
  • This answer目标C是直截了当的,有启发性的,近期的,虽然目标不是很明显。

0 个答案:

没有答案