我目前正在从事一个大型项目,该项目最近发生了许多变化,最突出的是添加了线程支持。
在浏览代码时,我已经确定了可能导致竞争条件的部分,如果不是现在,那么在将来的某个时候。为了防止这种回归,我想编写一个可以可靠地检测该特定区域中的竞争条件的测试,以确保未来的提交不会导致此错误。
代码中没有乱七八糟的 sleep() 语句,而是一个潜在的死锁和竞争雷区,我想确保健壮性。
这个项目完全是用 C 语言编写的。那么,我是否可以编写单元测试来防止竞争条件?
我目前正在从事一个大型项目,该项目最近发生了许多变化,最突出的是添加了线程支持。
在浏览代码时,我已经确定了可能导致竞争条件的部分,如果不是现在,那么在将来的某个时候。为了防止这种回归,我想编写一个可以可靠地检测该特定区域中的竞争条件的测试,以确保未来的提交不会导致此错误。
代码中没有乱七八糟的 sleep() 语句,而是一个潜在的死锁和竞争雷区,我想确保健壮性。
这个项目完全是用 C 语言编写的。那么,我是否可以编写单元测试来防止竞争条件?
竞争条件本质上是非确定性的结果。如果你不能确保调用序列是安全的,那么引入一些运行时检查来验证协议不变量是否得到遵守。然后,至少无论何时发生故障,您都会有证据。
虽然这不能解决您的问题,但它至少为您提供了一个量化问题程度的工具。
如果任何竞赛是由应用程序范围之外的事件触发的,那么任何静态分析都需要对其进行建模,以便能够检测条件。
Clang Thread Sanitizer的工作原理是在执行时监视您的测试过程。每当一个线程在不受保护的情况下读取或写入内存时,它都会记录下来,并且它会告诉您是否有任何一块内存被多个线程不受保护地访问。
Valgrind DRD 工具可用于检测许多线程错误。只需使用此工具并运行您通常的测试用例。