繁体   English   中英

.NET 6 PriorityQueue 线程安全吗?

[英]Is .NET 6 PriorityQueue thread-safe?

.NET 6 现在有PriorityQueue<TElement,TPriority>这非常有用。 该文档还不是很清楚(在提出问题时授予该文档仍然适用于 RC1)是否是线程安全的 两件事情:

  • 它位于System.Collections.Generic和似乎没有要在同等System.Collections.Concurrent

  • 它确实有名为TryDequeueTryPeek方法。 当然,它们可能只是在队列为空时不会抛出异常的方法,但它确实给人一种并发集合的印象。

我可以将它用于多线程环境而无需包装/锁定(例如在 ASP.NET Core 网站中)吗? 我不知道的任何并发等效项(如果可能,我尽量不使用 3rd-party 包)?

例如,查看PriorityQueue.Enqueue源代码,很明显该代码不是线程安全的:

public void Enqueue(TElement element, TPriority priority)
{
    // Virtually add the node at the end of the underlying array.
    // Note that the node being enqueued does not need to be physically placed
    // there at this point, as such an assignment would be redundant.

    int currentSize = _size++; // <-- BOOM

文档还不是很清楚

它实际上是。 .NET 中的任何内容都不是线程安全的,除非在文档中明确提及。 时期。

线程安全伴随着(显着的)性能开销,特别是在一般情况下(即不假设特定用途)。 因此,“以防万一”让所有线程都安全是非常愚蠢的。 因此,.NET 中的一般概念(从 1.0 开始)即没有任何东西是线程安全的,除非在文档中明确提到它。

正如你所说,文档没有提到线程安全。 因此,非常清楚非线程安全。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM