如何编写检查竞争条件的测试?

时间:2013-09-12 18:18:01

标签: c multithreading concurrency race-condition

我目前正在开展一个大型项目,该项目最近有很多变化,最突出的是增加了线程支持。

在查看代码时,我已经确定了可能导致竞争条件的部分,如果不是现在,那么将来的某个时间。为了防止这种回归,我想编写一个能够可靠地检测该特定区域中的竞争条件的测试,以确保未来的提交不会导致此故障。
代码没有乱七八糟的语句,但是潜在的死锁和竞争雷区,我想确保稳健性。

这个项目完全用C编写。那么,我是否还要编写单元测试以防止竞争条件?

3 个答案:

答案 0 :(得分:2)

种族条件本质上是非决定论的结果。如果您无法确保调用序列是安全的,那么请引入一些运行时检查来验证协议不变量是否得到遵守。然后,至少每当它们出现时你都会有错误的证据。

虽然这不能解决您的问题,但它至少为您提供了量化问题程度的工具。

如果任何比赛是从应用范围之外的事件触发的,那么任何静态分析都需要对其进行建模以便能够检测条件。

答案 1 :(得分:0)

Valgrind DRD工具可用于检测许多线程错误。只需使用此工具并运行您通常的测试用例。

答案 2 :(得分:0)

Clang Thread Sanitizer通过在执行时观察您的测试过程来工作。每当一个线程读取或写入无人看守的内存时,它就会记录它,它会告诉你是否有任何一块内存被多个线程无人看守。