许多读者,一个作者——是否有可能避免锁定?假设您有一个内存中的字符串列表,以及一个具有许多读取器但只有一个写入器线程的多线程系统。一般来说,是否可以在不使用锁的情况下在C#中实现这样的系统?实现是否对线程如何交互做出任何假设(或限制它们何时可以做什么)?是的。诀窍是确保列表保持不变。作者将拍摄主集合的快照,修改快照,并将快照发布到包含对主集合的引用的变量。以下示例演示了这一点。publicclassExample{//这是不可变的主集合。易失性列表集合=newList();voidWriter(){varcopy=newList(collection);//快照集合。复制。添加(“你好世界”);//修改快照。收藏=复制;//发布快照。}voidReader(){Listlocal=collection;//获取本地引用以进行安全读取。if(local.Count>0){DoSomething(local[0]);}}}这种方法有一些注意事项。由于上述限制,这对您有益的情况非常有限。最大的问题是写入首先需要一个完整的副本,所以它们可能很慢。但是,如果写入很少,那么这可能是可以容忍的。我在这里的回答中描述了更多模式,包括对多位作者安全的模式。为避免锁定,您可能需要考虑Microsoft的并发集合。这些集合提供对有序和无序形式的对象集合的线程安全访问。他们使用一些巧妙的技巧来避免锁定在尽可能多的实例中。这是对线程库的一个相当普遍的要求——这样的锁通常被称为“读写器锁”,或者是该主题的一些变体。我不必专门使用C#实现,但有一个:http://msdn.microsoft.com/en-us/library/system.threading.readerwriterlockslim.aspx当然,你遇到的问题是如果读者总是在阅读,你将永远无法让作家写作。我相信你必须自己处理。(好的,所以它在技术上仍然是一个“锁”,但它不是一个C#“锁”构造,它是一个更复杂的对象,专门为问题中所述的目的而设计。所以我猜它是否是一个正确的答案在某种程度上取决于关于语义以及他问这个问题的原因。)您还可以使用微软新的不可变集合库:http://blogs.msdn.com/b/bclteam/archive/2012/12/18/preview-of-immutable-collections-released-on-nuget.aspx注意:这与并发集合完全分开。如果编写者只在头部或尾部插入/删除,则可以使用无锁定的单链表方法。在任何一种情况下,如果预先构造新节点,则只需要一个原语操作(head=newHead;或tail.next=newTail)即可使读取操作可见。在性能方面,插入和删除是O(1),而长度计算是O(n)。以上就是C#学习教程:多读一写——是否可以避免加锁?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
