因此,我有许多线程正在向我提供输入数据,这些数据必须由单个线程按到达顺序进行处理。当前,所有输入项最终都插入队列中,并且对队列的读/写操作受到C#lock语句的保护。但是,随着时间的流逝,应用程序的CPU使用率上升到了无法接受的水平,分析器表示大部分CPU时间都花费在lock语句本身上。是否可以使用一种更有效的同步方法来代替锁,该方法可以支持许多作者和一个读者?
最佳答案
听起来好像作家在争夺锁。考虑一个模型,其中每个编写者都有自己的队列,并且读者使用Peek method从每个队列中读取第一条消息而不删除它。然后,读取器可以继续在队列之间进行迭代,从每个队列中窥视第一批项目中的第一批项目,然后删除并处理该第一批项目。它将比您当前的体系结构慢,但是应该消除编写者之间的锁争用。
一个简单的示例可能看起来像:
public class TimestampedItem<T> : IComparable<TimestampedItem<T>>
{
public DateTime TimeStamp { get; set; }
public T Data { get; set; }
public int CompareTo(TimestampedItem<T> other)
{
return TimeStamp.CompareTo(other.TimeStamp);
}
}
public void ReadFirstFromEachQueue<T>(IEnumerable<Queue<TimestampedItem<T>>> queues)
{
while (true)
{
var firstItems = new List<TimestampedItem<T>>(queues.Select(q => { lock (q) { return q.Peek(); } }));
ProcessItem(firstItems.OrderBy(tsi => tsi.TimeStamp).First());
}
}
}
关于c# - 对许多作家而言最有效的锁单读者并发模型?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7115603/