集合 Queue 和 ConcurrentQueue 都有一個 TryDequeue 方法。分別將 TryDequeue 與 Queue 和 ConcurrentQueue 一起使用有什么區別?Queue 的 TryDequeue 方法在多執行緒環境下是執行緒安全的嗎?
uj5u.com熱心網友回復:
Queue.TryDequeue()不是執行緒安全的。
我們可以看看它的實作來證明:
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>明確指出:
不保證任何實體成員都是執行緒安全的。
當然, 的方法ConcurrentQueue是執行緒安全的,按照定義ImmutableQueue也是執行緒安全的。
(Try以 的名義TryDequeue()指的是它處理空佇列而不是與執行緒安全有關的任何事情。)
uj5u.com熱心網友回復:
沒有任何東西是Queue<T>執行緒安全的 - 甚至不是Count
完全不同的是:執行緒安全。On ConcurrentQueue<T>,是的:它是執行緒安全的。也有一些小的 API 差異(Dequeue()例如,并發版本上缺少),但主要是:API 形狀是直接可比較的,給予或接受執行緒安全。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/517027.html
