【发布时间】:2021-12-27 09:40:21
【问题描述】:
.NET 6 现在有PriorityQueue<TElement,TPriority>,这非常有用。该文档还不是很清楚(在提出问题时授予该文档仍然适用于 RC1)它是否是线程安全的。两件事:
-
它位于
System.Collections.Generic中,而System.Collections.Concurrent中似乎没有等价物。 -
它确实有名为
TryDequeue和TryPeek的方法。当然,它们可能只是在队列为空时不会抛出异常的方法,但它确实给人一种并发集合的印象。
我可以将它用于多线程环境而不进行包装/锁定(例如在 ASP.NET Core 网站中)吗?任何我不知道的并发等效项(如果可能,我尽量不使用 3rd-party 包)?
【问题讨论】:
-
这有点遗漏——通常 MSDN 文档擅长说明一个类型是否是线程安全的。然而,看看the source,很明显它不是线程安全的。您将需要使用自己的锁定。
-
在我看来,最简单的规则是,如果类型没有明确声明它是线程安全的(或者有暗示它的名称),你应该假设它不是.
-
这不仅是您的规则 - 它是编写 .NET 的一般方式。线程安全是一项罕见的功能,需要付出一定的代价。除非明确提及,否则默认情况下某些东西不是线程安全的。因此,文档非常清楚这不是线程安全的。
-
没有。着眼于大局,PriorityQueue 的重点是迭代。您按优先顺序取回元素。迭代永远不是线程安全的。安全集合类通过让枚举器复制集合来伪造它,这只会使其在逻辑上安全。但是很昂贵,并且不会阻止不再出现在集合中的元素出现。只有使用 lock 的客户端代码才能使其真正安全,小心锁定迭代器循环的痛苦。
标签: c# .net multithreading priority-queue .net-6.0