是否存在开源技术来模拟所有可能的内存访问排序排列,以详尽地单元测试线程C或C ++代码?
备注和示例
一个答案是:“使用内存安全/功能/非常高级的语言。避免使用C和C ++。”但是,这个答案回答了另一个问题。 Rust,Go,Erlang,Haskell等都很棒;但我的问题是关于无约束的C,C ++,汇编等。
另一个答案是:“使用future
,promise
等来避免这个问题。”但是,我的问题是关于测试方法,而不是编码方法。我不寻求代码来帮助我满足范式,而是寻求帮助我测试代码的范例(或工具)。
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 ++程序员如何在编码时获得最大性能的单元测试线程逻辑呢?
各种作者都警告说,对并发思考是多么困难。如果存在的话,在具体情况下系统地暴露潜在故障的开源技术或工具将有所帮助。是吗?
参考