我有一个.NET队列对象。生成器线程执行Enqueue操作,队列中排队的数据是byte []数组,而另一个消费者线程对同一队列对象执行Dequeue操作。
我使用锁来处理并发。我的代码似乎一直很好,但昨天发生了奇怪的事情。我从消费者线程获得的数据与我生成的数据不同:数组长度错误,重复数组......这是由失败的线程安全保护引起的吗?
在我看来,并发性只会导致数据丢失。
我在这里的第一篇文章,请耐心等待。
答案 0 :(得分:0)
生产者线程不应该保留对数组的引用,并在它排队后修改它。始终创建一个新阵列。 (我可能会说明显而已,但没有更多信息就很难做得更好)
答案 1 :(得分:0)
远比简单的数据丢失更糟糕。 Queue类可以在需要时重新分配其内部缓冲区以容纳越来越多的元素。不正确的锁定可以使用旧的头部和尾部索引值访问新缓冲区。当你幸运时,你只会得到一个例外,更可能的是你只是得到了错误的元素。