我使用ConcurrentBag在运行时存储对象。在某些时候,我需要清空行李并将行李内容存储到列表中。这就是我的所作所为:
IList<T> list = new List<T>();
lock (bag)
{
T pixel;
while (bag.TryTake(out pixel))
{
list.Add(pixel);
}
}
我的问题是同步,据我在书中读到的锁比其他同步方法更快。来源 - http://www.albahari.com/threading/part2.aspx。
性能是我的第二个问题,我想知道我是否可以在此时使用ReaderWriterLockSlim。使用ReaderWriterLockSlim有什么好处?原因是,我不希望此操作阻止传入的请求。
如果是,我应该使用可升级锁吗?
有什么想法吗?评论
答案 0 :(得分:5)
我不确定你为什么要使用锁。 ConcurrentBag
背后的整个想法是它是并发。
除非你只是试图阻止其他一些线程在你清空时把东西拿走或者添加东西。
重新阅读你的问题,我很确定你根本不想在这里同步访问。 ConcurrentBag
允许多个线程Take
和Add
,而无需进行任何显式同步。
如果您锁定了行李,那么在您的代码运行时,没有其他线程可以添加或删除内容。当然,假设您使用锁保护其他所有对包的访问。一旦你这样做,你就完全失去了拥有无锁并发数据结构的目的。您的数据结构已成为一个由锁控制的性能不佳的列表。
如果您使用读写器锁,也一样。您必须同步每次访问。
在这种情况下,您无需添加任何显式同步。抛开锁。
答案 1 :(得分:1)
当线程连续执行大量操作(突发 - 低争用)时,锁定很棒
当你拥有比写锁更多的读锁时,RWSlim很棒(读重 - 读高争用)
当您需要多个读取器和/或编写器同时工作(读/写混合 - 大量争用)时,无锁是很棒的