我有一个管理大量数据队列的代码,它锁定了女巫锁语句,以确保一次只有一个线程正在处理它。线程是否自动排队以访问已锁定的代码?
队列中的数据顺序非常重要,每个线程及其参数都可以添加或取消。
如何确保线程按照FIFO的顺序排队等待队列?锁定语句是否可以保证这一点?
var t = new Thread(() => parse(params)); //This is how I start my threads.
t.Start();
我有一个管理大量数据队列的代码,它锁定了女巫锁语句,以确保一次只有一个线程正在处理它。线程是否自动排队以访问已锁定的代码?
队列中的数据顺序非常重要,每个线程及其参数都可以添加或取消。
如何确保线程按照FIFO的顺序排队等待队列?锁定语句是否可以保证这一点?
var t = new Thread(() => parse(params)); //This is how I start my threads.
t.Start();
不,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;
}
}
}
非常感谢,但我正在编写一个TCP套接字库,兼容性有点问题。 .Net框架2.0有什么相似之处吗? – user3200174
我不确定我是否了解您的原始问题。随时只有一个线程将从套接字读取,对吗?它关系到哪个线程? – Douglas
在MSDN页面中,ConcurrentQueue
锁并不保证先进先出访问。如果您受限于.NET 2.0,另一种方法是Queue。请记住,Queue
不是线程安全的,因此您应该访问synchronize。
http://blogs.msdn.com/b/bclteam/archive/2005/03/15/396399.aspx值得一读readroot。 –
“线程顺序”有点矛盾。 –