gpt4 book ai didi

c# - 消息队列思想

转载 作者:太空狗 更新时间:2023-10-29 22:08:39 25 4
gpt4 key购买 nike

我们使用 C# Queue 实现了一个消息队列。我们知道我们只有一个消费者从队列中取出可用消息,以使用 while 循环进行处理。我们也知道只有一个生产者将消息放入队列。

我们在上面的消息队列上有一个,以确保消费者和生产者不能同时访问队列。

我的问题是 lock 是必要的吗?如果 Queue 增加其 Count 属性 AFTER 一个项目实际上被添加并且如果消费者在检索之前检查 Count ,即使我们没有那个 lock,消费者也应该得到一个完整的消息项。正确的?所以我们不会面临部分消息项目问题。那么我们可以摆脱那个吗?

lock 会降低系统速度,偶尔我们会看到检索线程被阻塞了一段时间,因为我们有一个非常重的生产者。

编辑:

很遗憾,我们使用的是 .Net 3.5。

最佳答案

真正的问题是,队列的内部数据结构可能会在入队或出队发生时发生变化,在此期间,从另一个线程的角度来看,数据结构处于不确定状态。

例如,入队可能需要扩展内部数据结构,在其中创建新结构,并将旧项目从旧结构复制到新结构。此过程中将涉及许多步骤,在任何时候另一个线程访问队列都是危险的,因为操作未完成。

因此,在入队\出队期间,您必须锁定以使这些操作在逻辑上看起来是原子的。

您可以尝试新的 ConcurrentQueue .Net 4.0 中的类,因为它使用非锁定算法可能具有更好的性能特征。

关于c# - 消息队列思想,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4728407/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com