我正在编写自己的优先队列/排序列表实现,并希望它具有并发性。
为了使它线程安全,我使用 lock(someObject)
,我想验证 C# 中互斥锁的一些行为。
我的排序列表的内部表示基本上是一个链接在一起的带有 head
和插槽的链表。
类似于:
internal class Slot
{
internal T Value;
internal Slot Next;
public Slot(T value, Slot next = null)
{
Value = value;
Next = next;
}
}
每次我在操作head
时,由于线程安全性,我都需要使用lock(someObject)
。为了实现ICollection
接口,我必须实现public IEnumerator<T> GetEnumerator()
方法。在这个方法中,我需要使用互斥锁来读取我的head
。
public IEnumerator<T> GetEnumerator()
{
lock (syncLock)
{
var curr = head;
while (curr != null)
{
yield return curr.Value;
curr = curr.Next;
}
}
}
我的问题是:在枚举器中,syncLock
是否在整个时间内都被锁定(因此在到达方法结尾后将被解锁),还是在产生值后自动解锁?
System.Collections.Concurrent
中的任何集合,例如BlockingCollection
吗?https://msdn.microsoft.com/zh-cn/library/system.collections.concurrent.aspx - LeoGetEnumerator
的调用者。 - Evk