有哪些方法可以测试并发数据结构,以确保从多个线程访问数据结构时表现正常?
答案 0 :(得分:1)
我通常通过在分布式线程/进程中的适当位置插入sleep()
调用来测试这些类型的东西。
例如,要测试锁定,请在争用点将sleep(2)
放入所有线程中,并在大约1秒钟内生成两个线程。第一个应该获得锁定,第二个应该等待它。
大多数竞争条件都可以通过扩展此方法进行测试,但如果您的系统组件太多,则可能很难或不可能知道需要测试的每种可能情况。
答案 1 :(得分:1)
使用预先存在的,经过预先测试的库,尽可能满足您的需求。
确保代码具有适当的自我一致性检查(最好是快速健全性检查),并在尽可能多的不同类型的硬件上运行代码,以帮助缩小有趣的计时问题。
让多人同行查看代码,最好不要预先解释它应该如何工作。这样他们就必须弄清楚应该有助于捕获更多错误的代码。
设置一堆线程,它们只对数据结构进行随机操作,并以某种速率检查一致性。
答案 2 :(得分:1)
首先假设您对访问/修改数据的调用不是线程安全的,并使用锁来确保一次只有一个线程可以访问/修改数据的任何部分。只有在你能够通过多个线程同时证明特定类型的访问在锁定之外是安全的之后,才能将该代码移到锁外。
假设最坏的情况,例如您的代码将在某些指针操作或其他关键点的中间停止,并且另一个线程将在转换中期遇到该数据。如果这会产生不好的结果,请将其保留在锁定范围内。
答案 3 :(得分:0)
运行并发线程一天或几天,看看会发生什么。 (听起来很奇怪,但发现竞争条件是一个非常复杂的话题,只是尝试它是最好的方法)。
答案 4 :(得分:0)
并发系统具有概率性,并且错误通常难以复制。因此,您需要运行各种输入/输出案例,每个案例都会随着时间(小时,天等)进行测试,以便检测可能的错误。
并发数据结构的测试涉及检查容器在预期事件(如插入和删除)之前和之后的状态。
答案 5 :(得分:0)
所有其他答案都集中在实际测试代码上,通过它的步调并实际以一种或另一种形式运行它,或礼貌地说“不要自己动手,使用现有的库”。
这很棒,但IMO,最重要的(实际测试也很重要)测试是逐行查看代码,每个代码行询问“如果发生了什么?我被另一个线程打断了?“想象一下另一个线程,在这个中断期间运行几乎任何其他线路/功能。做事情仍然保持一致吗?在竞争资源时,其他线程会阻塞还是旋转?
这是我们在学习并发性时在学校所做的,这是一种非常有效的方法。最重要的是,我觉得花时间向自己证明事情是一致的,并且在所有州都按预期工作,这是你在处理这些事情时应该使用的第一种技术。