如何为生产者 - 消费者问题的解决方案编写测试?

时间:2013-02-13 01:57:56

标签: .net multithreading algorithm unit-testing producer-consumer

作为一个练习,我想实现生产者 - 消费者问题的解决方案。假设我将有一个数组int []缓冲区和两个分别模拟生产者和客户的方法Produce()和Consume(),以及一个“Execute”方法来异步调用这两个方法。

可能是为了测试实现是否会导致死锁,只是让Produce and Consume重复大量时间(如100万),让Execute等待这两种方法完成,然后(在我的单元测试)确保呼叫在一定时间(可能是1分钟)后返回。但是如何测试实现中是否存在竞争条件或数据损坏?

1 个答案:

答案 0 :(得分:1)

死锁不是你应该检查的唯一东西。始终可以快速检测到死锁 - 您的应用停止了。丢失或重复的消息更危险和更隐蔽 - 欺骗性消息可能导致应用程序崩溃的时间晚于重复发生时,并且很可能发生在与发生重复的情况下不同的模块/线程/块中。这样的错误绝对是一场噩梦。

在测试队列类时,我创建了一个带有内部随机数组[256]成员和校验和的“Message”类。我最初创建10000个这些消息,'totalChecksum'他们各自的校验和,并将指针推送到'池'队列。多个生成器(我通常使用32),从池队列中弹出*消息实例并将它们推送到另一个“通信”队列。多个消费者,(我通常使用16)来自通信队列的pop *消息实例,并将它们推回到池队列中。

在为房间预热5分钟后,一个简单的GUI形式计时器通过设置一个挥发性布尔值来暂停生产者,该布尔值告诉生产者在manualResetEvent上等待。休眠(500)之后,所有10000条消息都应该回到池队列中,并且GUI检查池队列计数是10000,在循环中弹出10000条消息,totalChecksumming它们,推回并最终与初始totalChecksum进行比较。如果通过,则重置布尔值并发出MRE信号以使生产者再次运行。

我反复进行这个测试。如果有任何失败,则队列不适合用途。