线程是否自动排队以访问锁定的代码?

时间:2014-01-17 17:08:41

标签: c# multithreading

我有一个管理大型数据队列的代码,它锁定了巫婆锁定语句,以确保一次只有一个线程正在处理它。

队列中的数据顺序非常重要,每个带有参数的线程都可以添加或取出。

如何确保线程排队等待像队列一样的FIFO顺序? lock语句是否保证了这一点?

 var t = new Thread(() => parse(params));      //This is how I start my threads.
 t.Start();

2 个答案:

答案 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 访问。