如果只有一个线程要添加到队列中,并且只有一个线程要从队列中检索,我认为没有必要为这些访问操作锁定队列。
通常检索将处于循环中。如果它错过了一个项目,它将在下一次尝试中获得它。唯一关心的是得到部分数据。如果它是值类型队列并且该值大于一个基本内存单元,则可能发生。但如果它是一个参考类型,它应该没问题。
我是对的吗?答案 0 :(得分:6)
假设您在谈论Queue<T>
。
只要正在写入的线程和正在读取的线程是相同的线程,就不需要锁定。如果它们是不同的线程,则确实需要锁定。文档明确指出,如果不同线程上有读者和编写者,则需要锁定
答案 1 :(得分:0)
我相信一个队列将信息保存在一个数组中;如果队列中的项目数超过了数组的大小,则数组将替换为更大的数组。队列不包含任何机制,以避免在发生此类重新分配时中断正在进行的队列操作。
当然可以构建无锁队列实现,它可以与并发读写器一起使用。如果使用链表数据结构,则还可以在不使用锁的情况下支持多个并发写入器(使用Interlocked.CompareExchange来更新队列)。需要为每次插入分配新对象的链表列表通常不如基于数组的那个有效,但多作者队列可以很方便。