.net 如何编写测试以解决生产者-消费者问题?
作为练习,我想实施一个解决生产者-消费者问题的方案。假设我有一个数组int[]buffer和两个方法product()和Consume(),分别模拟生产者和消费者,还有一个“Execute”方法异步调用这两个方法.net 如何编写测试以解决生产者-消费者问题?,.net,multithreading,algorithm,unit-testing,producer-consumer,.net,Multithreading,Algorithm,Unit Testing,Producer Consumer,作为练习,我想实施一个解决生产者-消费者问题的方案。假设我有一个数组int[]buffer和两个方法product()和Consume(),分别模拟生产者和消费者,还有一个“Execute”方法异步调用这两个方法 可能需要测试实现是否不会导致死锁,只需让product和Consume重复大量时间(比如100万次),让Execute等待这两个方法完成,然后(在我的单元测试中)确保调用在特定时间(可能1分钟)后返回。但是,如何测试实现中是否没有竞争条件或数据损坏?死锁不是唯一应该检查的问题。死锁总是
可能需要测试实现是否不会导致死锁,只需让product和Consume重复大量时间(比如100万次),让Execute等待这两个方法完成,然后(在我的单元测试中)确保调用在特定时间(可能1分钟)后返回。但是,如何测试实现中是否没有竞争条件或数据损坏?死锁不是唯一应该检查的问题。死锁总是很快被检测到-你的应用程序停止。丢失或复制的消息更危险,更隐蔽-复制的消息可能会导致应用程序崩溃,时间比dup发生时晚得多,并且很可能是在与dup发生位置不同的模块/线程/块中。这样的错误简直是一场噩梦 在测试队列类时,我创建了一个带有内部随机数组[256]成员和校验和的“Message”类。我最初创建了10000条这样的消息,“totalChecksum”它们各自的校验和,并将指向它们的指针推送到“pool”队列中。多个生产者(我通常使用32个)从池队列中弹出*消息实例,并将它们推送到另一个“comms”队列中。多个使用者(我通常使用16个)来自comms队列的pop*消息实例,并将它们推回池队列 在房间预热5分钟后,一个简单的GUI窗体计时器通过设置一个可变布尔值来停止生产者,该布尔值告诉生产者等待manualResetEvent。睡眠(500)之后,所有10000条消息都应该回到池队列中,GUI检查池队列计数是否为10000,在循环中弹出10000条消息,对它们进行totalChecksum,将其推回,最后与初始totalChecksum进行比较。如果通过,布尔值被重置,MRE发出信号使生产者再次运行
我连夜重复地进行这个测试。如果出现任何故障,队列就不适合使用。死锁不是唯一应该检查的问题。死锁总是很快被检测到-你的应用程序停止。丢失或复制的消息更危险,更隐蔽-复制的消息可能会导致应用程序崩溃,时间比dup发生时晚得多,并且很可能是在与dup发生位置不同的模块/线程/块中。这样的错误简直是一场噩梦 在测试队列类时,我创建了一个带有内部随机数组[256]成员和校验和的“Message”类。我最初创建了10000条这样的消息,“totalChecksum”它们各自的校验和,并将指向它们的指针推送到“pool”队列中。多个生产者(我通常使用32个)从池队列中弹出*消息实例,并将它们推送到另一个“comms”队列中。多个使用者(我通常使用16个)来自comms队列的pop*消息实例,并将它们推回池队列 在房间预热5分钟后,一个简单的GUI窗体计时器通过设置一个可变布尔值来停止生产者,该布尔值告诉生产者等待manualResetEvent。睡眠(500)之后,所有10000条消息都应该回到池队列中,GUI检查池队列计数是否为10000,在循环中弹出10000条消息,对它们进行totalChecksum,将其推回,最后与初始totalChecksum进行比较。如果通过,布尔值被重置,MRE发出信号使生产者再次运行 我连夜重复地进行这个测试。如果出现任何故障,则该队列不适合使用