5Yr*_*DBA 5 .net c# queue .net-3.5
我们使用C#实现了一个消息队列Queue.我们知道我们只有一个消费者从队列中取出可用消息以进行while循环处理.我们也知道只有一个生产者将消息放入队列.
我们有一个lock上面的消息队列,以确保消费者和生产者不能同时访问队列.
我的问题是lock必要的吗?如果在实际添加项目之后Queue增加其Count属性,并且如果消费者在检索之前检查,则消费者应该获得完整的消息项,即使我们没有.对?因此,我们不会面临部分邮件项目问题.那我们可以摆脱那个?Countlocklock
这lock将减慢系统速度,偶尔我们可以看到检索线程被阻塞一段时间,因为我们有一个非常重的生产者.
编辑:
不幸的是我们正在使用.Net 3.5.
Tim*_*oyd 10
真正的问题是队列的内部数据结构可能在发生入队或出队时发生变异,并且在此期间,数据结构处于与另一线程的观点不同的状态.
例如,入队可能需要扩展内部数据结构,其中创建新结构,并且旧项目从旧结构复制到新结构.此过程将涉及许多步骤,其中任何时候由于操作未完成而导致另一个线程访问队列将是危险的.
因此,在enqueue\dequeue期间,您必须锁定以使这些操作看起来在逻辑上是原子的.
您可以在.Net 4.0中尝试新的ConcurrentQueue类,因为它可能具有更好的性能特征,因为它使用非锁定算法.
| 归档时间: |
|
| 查看次数: |
974 次 |
| 最近记录: |