gpt4 book ai didi

c# - 多写者单读者并发模型的最有效锁?

转载 作者:行者123 更新时间:2023-11-30 14:16:41 24 4
gpt4 key购买 nike

所以我有很多线程为我提供输入数据,这些数据必须按到达顺序由单个线程处理。目前,所有输入项最终都插入到队列中,并且对队列的读/写操作受到 C# lock 语句的保护。然而,随着时间的推移,应用程序的 CPU 使用率上升到 Not Acceptable 水平,分析器表示大部分 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com