队列有时会被破坏

Vig*_*esh 2 .net c# queue

我正在运行一个大量多线程的程序,并看到一些奇怪的行为.我将首先尝试解释一下架构.

应用程序基本上有一个大小为30的队列数组.数组中的每个队列都由一个线程处理.外部ome外部线程将根据id的mod继续将实体添加到队列数组中.

例如:如果实体id = 100,它将进入100%30 =第10队列

我面临的问题有时是将id = 100的实体添加到队列中,但处理线程将一个完全不同的实体出列,但属于同一个队列.Ë

例如:外部线程将实体id = 50排队,进入第20个队列,但线程出列,并且实体的id = 80

这只发生在生产环境中,无论如何都无法模拟.它很少发生,没有任何类型的触发器,如应用程序重启后.

我怀疑这可能会发生,因为我在排队/出队时没有使用任何锁定导致数据损坏.

想知道是否有人在此之前遇到过类似的问题,或者有任何建议可以避免这种情况.添加锁是前进的方法之一,但我想在确定之前确认问题的根源.

qua*_*dev 5

我怀疑这可能会发生,因为我在排队/出队时没有使用任何锁定导致数据损坏.

是的,它是数据竞赛的来源.如果您的多个线程正在生成并使用常见的,不受保护的数据结构上的对象,那么您描述的效果将随机出现.让数据竞争"在生产中更多地发生"是典型的,因为您使用更优化的代码,在更快的机器上,并且通常具有更多线程,增加了数据竞争的可能性.

使用锁定机制(例如监视器)保护对公共结构的每次访问.MSDN还提供了有关线程同步的多个教程.

最后,正如@Ronan已经指出的那样,考虑使用以下集合System.Collections.Concurrent:它们的访问权限已经是线程安全的,并且它们针对多线程场景进行了优化,使您的工作变得更加容易.

编辑: 当性能很重要时,请始终考虑分析两种方法(使用手动保护集合与集合System.Collections.Concurrent)