Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 如何编写测试以解决生产者-消费者问题?_.net_Multithreading_Algorithm_Unit Testing_Producer Consumer - Fatal编程技术网

.net 如何编写测试以解决生产者-消费者问题?

.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分钟)后返回。但是,如何测试实现中是否没有竞争条件或数据损坏?死锁不是唯一应该检查的问题。死锁总是

作为练习,我想实施一个解决生产者-消费者问题的方案。假设我有一个数组int[]buffer和两个方法product()和Consume(),分别模拟生产者和消费者,还有一个“Execute”方法异步调用这两个方法


可能需要测试实现是否不会导致死锁,只需让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发出信号使生产者再次运行

我连夜重复地进行这个测试。如果出现任何故障,则该队列不适合使用