gpt4 book ai didi

c# - 队列和并发队列的 TryDequeue 方法之间的区别

转载 作者:行者123 更新时间:2023-12-02 01:27:36 28 4
gpt4 key购买 nike

Queue 和 ConcurrentQueue 这两个集合都有一个方法 TryDequeue。 TryDequeue 分别与 Queue 和 ConcurrentQueue 一起使用有什么区别? Queue的TryDequeue方法在多线程环境下是线程安全的吗?

最佳答案

Queue.TryDequeue() 不是线程安全的。

我们可以看看its implementation证明:

public bool TryDequeue([MaybeNullWhen(false)] out T result)
{
int head = _head;
T[] array = _array;

if (_size == 0)
{
result = default;
return false;
}

result = array[head];
if (RuntimeHelpers.IsReferenceOrContainsReferences<T>())
{
array[head] = default!;
}
MoveNext(ref _head);
_size--;
_version++;
return true;
}

很容易看出它不是线程安全的。只是_size--单独不是线程安全的。

但即使没有源代码, Queue<T> 的文档明确指出:

Any instance members are not guaranteed to be threadsafe.

当然是ConcurrentQueue的方法是线程安全的,根据定义 ImmutableQueue也是线程安全的。

(Try 名称中的 TryDequeue() 指的是它处理空队列,而不是与线程安全有关的任何事情。)

关于c# - 队列和并发队列的 TryDequeue 方法之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74107638/

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