我有一个管理大型数据队列的代码,它锁定了巫婆锁定语句,以确保一次只有一个线程正在处理它。
队列中的数据顺序非常重要,每个带有参数的线程都可以添加或取出。
如何确保线程排队等待像队列一样的FIFO顺序? lock语句是否保证了这一点?
var t = new Thread(() => parse(params)); //This is how I start my threads.
t.Start();
答案 0 :(得分:3)
不,lock
语句不保证FIFO排序。每Albahari:
如果有多个线程争用锁定,它们会在“就绪队列”上排队,并按照先到先得的原则授予锁定(需要注意的是Windows和CLR行为的细微差别意味着有时会违反队列的公平性。)
如果您想确保以FIFO顺序检索商品,则应使用ConcurrentQueue<T>
集合。
修改:如果您的目标是.NET 2.0,则可以为并发线程安全队列使用自定义实现。这是一个微不足道的:
public class ThreadSafeQueue<T>
{
private readonly object syncLock = new object();
private readonly Queue<T> innerQueue = new Queue<T>();
public void Enqueue(T item)
{
lock (syncLock)
innerQueue.Enqueue(item);
}
public bool TryDequeue(out T item)
{
lock (syncLock)
{
if (innerQueue.Count == 0)
{
item = default(T);
return false;
}
item = innerQueue.Dequeue();
return true;
}
}
}
答案 1 :(得分:1)
Lock不保证先进先出权限。如果您受限于.NET 2.0,则另一种方法是Queue。请注意,Queue
不是线程安全的,因此您应该synchronize 访问。