0

我有一个 .NET 队列对象。生产者线程做Enqueue操作,入队的数据是一个byte[]数组,而另一个消费者线程对同一个队列对象做Dequeue操作。

我使用锁来处理并发。我的代码似乎一直运行良好,但昨天发生了奇怪的事情。我从消费者线程得到的数据与我产生的数据不同:数组长度错误、重复数组……这是线程安全保护失败造成的吗?

在我看来,并发只会导致数据丢失。

我在这里的第一篇文章,请多多包涵。

4

2 回答 2

0

生产者线程不应保留对数组的引用并在入队后对其进行修改。始终创建一个新数组。(我可能说的是显而易见的,但如果没有更多信息,很难做得更好)

于 2010-01-14T11:22:42.503 回答
0

这比简单的数据丢失要糟糕得多。当需要容纳越来越多的元素时,Queue 类可以重新分配其内部缓冲区。不正确的锁定可以使用头部和尾部索引的旧值访问新缓冲区。只有当你很幸运时你才会得到一个例外,更有可能的是你只是得到了错误的元素。

于 2010-01-14T12:42:01.820 回答