.NET 6 PriorityQueue 是线程安全的吗?
Is .NET 6 PriorityQueue thread-safe?
.NET 6 现在有非常有用的 PriorityQueue<TElement,TPriority>。该文档还不是很清楚(在提出问题时,文档仍然是针对 RC1 的)它是否是线程安全的。两件事:
它位于 System.Collections.Generic
中,但在 System.Collections.Concurrent
中似乎没有对应项。
它确实有名为 TryDequeue
和 TryPeek
的方法。当然,它们可能只是在队列为空时不会抛出异常的方法,但它确实给人一种并发集合的印象。
我可以在没有 wrapping/locking 的多线程环境中使用它吗(例如在 ASP.NET 核心网站中)?我不知道的任何并发等效项(如果可能,我尽量不使用第 3 方包)?
例如,查看 PriorityQueue.Enqueue
的 source code,可以立即看出代码 不是 线程安全的:
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
The document is not very clear yet
确实如此。 .NET 中的任何内容都不是线程安全的,除非在文档中明确提及。期间.
线程安全会带来(显着的)性能开销,尤其是在一般情况下(即不假设特定用途)。因此,“以防万一”使所有线程安全是非常愚蠢的。因此,.NET 中的一般概念(从 1.0 开始)就是没有什么是线程安全的,除非在文档中明确提及。
如您所说,文档中没有提到线程安全。因此,非常清楚不是线程安全的。
.NET 6 现在有非常有用的 PriorityQueue<TElement,TPriority>。该文档还不是很清楚(在提出问题时,文档仍然是针对 RC1 的)它是否是线程安全的。两件事:
它位于
System.Collections.Generic
中,但在System.Collections.Concurrent
中似乎没有对应项。它确实有名为
TryDequeue
和TryPeek
的方法。当然,它们可能只是在队列为空时不会抛出异常的方法,但它确实给人一种并发集合的印象。
我可以在没有 wrapping/locking 的多线程环境中使用它吗(例如在 ASP.NET 核心网站中)?我不知道的任何并发等效项(如果可能,我尽量不使用第 3 方包)?
例如,查看 PriorityQueue.Enqueue
的 source code,可以立即看出代码 不是 线程安全的:
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
The document is not very clear yet
确实如此。 .NET 中的任何内容都不是线程安全的,除非在文档中明确提及。期间.
线程安全会带来(显着的)性能开销,尤其是在一般情况下(即不假设特定用途)。因此,“以防万一”使所有线程安全是非常愚蠢的。因此,.NET 中的一般概念(从 1.0 开始)就是没有什么是线程安全的,除非在文档中明确提及。
如您所说,文档中没有提到线程安全。因此,非常清楚不是线程安全的。