【问题标题】:What would happen in an thread unsafe .NET queue object?在线程不安全的 .NET 队列对象中会发生什么?
【发布时间】:2010-01-14 11:12:10
【问题描述】:

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

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

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

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

【问题讨论】:

  • 您能告诉我们您使用什么机制来锁定吗?例如带有非常短的代码示例。
  • 并发问题会导致数据损坏或不一致。它可能是数据丢失、重复数据、损坏的数据,甚至是异常。会发生什么取决于您的实施。如果没有看到您正在做什么的示例,没有人会知道您的问题是什么。
  • 感谢您的 cmets!我只是使用监视器来做“锁定” get { Monitor.Enter(mQueue);字节[] 数据 = mQueue.Dequeue(); Monitor.Exit(mQueue);返回数据; } 设置 { Monitor.Enter(mQueue); mQueue.Enqueue(值); Monitor.Exit(mQueue);这有什么问题?

标签: .net multithreading queue unsafe


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2011-04-28
      • 2013-12-31
      • 1970-01-01
      • 1970-01-01
      • 2013-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-22
      相关资源
      最近更新 更多