gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:09:21 26 4
gpt4 key购买 nike

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

大概是为了测试执行会不会死锁,让Produce和Consume重复大量的时间(比如100万次),让Execute等待这两个方法完成,然后(在我的单元测试)只需确保调用在特定时间(可能是 1 分钟)后返回。但是如何测试实现中是否没有竞争条件或数据损坏?

最佳答案

死锁不是您应该检查的唯一事情。死锁总是很快被检测到——你的应用程序停止了。丢失或重复的消息更加危险和阴险 - 被欺骗的消息可能导致应用程序崩溃的时间比复制发生的时间晚得多,并且很可能在与复制发生的地方不同的模块/线程/ block 中。这样的错误绝对是一场噩梦。

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

在房间预热 5 分钟后,一个简单的 GUI 表单计时器通过设置一个告诉生产者等待 manualResetEvent 的可变 bool 值来停止生产者。一个 Sleep(500) 之后,所有 10000 条消息都应该回到池队列中,并且 GUI 检查池队列计数是否为 10000,在循环中弹出 10000 条消息,对它们进行 totalChecksumming,推回并最终与初始 totalChecksum 进行比较。如果通过, bool 值将被重置,并且 MRE 发出信号让生产者再次运行。

我整夜反复运行此测试。如果出现任何故障,则队列不适合使用。

关于.net - 如何为生产者-消费者问题的解决方案编写测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14845235/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com