2014-01-17 24 views
0

我有一个管理大量数据队列的代码,它锁定了女巫锁语句,以确保一次只有一个线程正在处理它。线程是否自动排队以访问已锁定的代码?

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

如何确保线程按照FIFO的顺序排队等待队列?锁定语句是否可以保证这一点?

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; 
     } 
    } 
} 
+0

非常感谢,但我正在编写一个TCP套接字库,兼容性有点问题。 .Net框架2.0有什么相似之处吗? – user3200174

+0

我不确定我是否了解您的原始问题。随时只有一个线程将从套接字读取,对吗?它关系到哪个线程? – Douglas

+0

在MSDN页面中,ConcurrentQueue 仅适用于.Net 4.0及更高版本。我正在寻找可以使用.Net 2.0进行编译以获得最大兼容性的内容。 – user3200174

1

锁并不保证先进先出访问。如果您受限于.NET 2.0,另一种方法是Queue。请记住,Queue不是线程安全的,因此您应该访问synchronize

+0

http://blogs.msdn.com/b/bclteam/archive/2005/03/15/396399.aspx值得一读readroot。 –