2011-02-07 33 views
3

测试并发数据结构以确保数据结构在从多个线程访问时行为正确的方法有哪些?测试并发数据结构

+0

使用其他人为您验证过的图书馆? – 2011-02-07 21:29:43

+0

[单元测试实时/并发软件]可能的重复(http://stackoverflow.com/questions/1733484/unit-testing-real-time-concurrent-software) – 2011-02-07 21:34:48

+0

更多考生:[多线程代码测试指南或确保代码是线程安全的](http://stackoverflow.com/questions/4444452/guidelines-for-testing-multithreaded-code-or-ensuring-that-c​​ode-is-thread-safe)和[Unit Testing Concurrent代码](http://stackoverflow.com/questions/2035890/unit-testing-concurrent-code)。这些全部位于右侧的* Related *列表中。 – 2011-02-07 21:36:15

回答

0

所有其他的答案都集中在通过把它通过其步伐实际测试代码,实际上是在这种或那种形式运行,或礼貌地说:“不要自己动手,使用现有的图书馆”。

这是伟大的和所有,但IMO,最重要的(实际测试也很重要)测试是看线代码和代码问“如果我被打断另一个线程在这里?“设想另一个线程,在这个中断期间运行其他任何线路/功能。事情仍然保持一致吗?竞争资源时,其他线程是否阻塞或旋转?

这是我们在学习并发性时所做的工作,它是一种令人惊讶的有效方法。最重要的是,我觉得花时间向自己证明事情是一致的,并且在所有州都按照预期工作,这是你在处理这些事情时应该使用的第一种技巧。

1

我通常由插嘴在分布式线程/进程的适当位置sleep()调用test这类事情。

例如,测试一个锁,把所有的线程sleep(2)在争论的焦点,和产卵两个线程大致间隔1秒。第一个应该获得锁定,第二个应该等待。

大多数竞态条件可以通过扩展这种方法测试,但如果你的系统有太多的部件可能很难或不可能知道需要测试每种可能的情况。

0

运行您的并发线程一个或几天,看看会发生什么。 (听起来很奇怪,但找出竞争条件是一个如此复杂的话题,只是尝试它是最好的方法)。

0

并发系统是概率性的,错误往往难以复制。因此,您需要运行各种输入/输出案例,每个案例都经过一段时间(小时,几天等)的测试,以检测可能的错误。

并发数据结构的测试涉及在预期事件(如插入和删除)之前和之后检查容器的状态。

1

如果可能,请使用预先存在的,预先测试过的库,以满足您的需求。

确保代码中有适当的自我一致性检查(最好是快速完整性检查),并在许多不同类型的硬件尽可能的运行您的代码,以帮助缩小有趣的时序问题。

有多人同行审查代码,最好没有预先解释它应该如何工作。这样他们不得不挖掘代码,这应该有助于捕获更多的错误。

设置一堆线程,除了对数据结构进行随机操作之外什么都不做,并且以某种速度检查一致性。

1

开始与您的访问电话/修改数据不是线程安全的,并使用锁,以确保只有一个线程可以访问/在同一时间修改数据的任何部分的假设。只有在您能够证明特定类型的访问在多个线程同时在锁之外安全的情况下,您才能将该代码移出锁。

假设最坏的情况,例如您的代码会在某些指针操作或另一个关键点中停止,并且另一个线程将在中间转换中遇到该数据。如果这样做会有不好的结果,请将其放在锁内。