另一个同步的问题...我希望你们不要生气;)同步多个阅读器,单个作者?
假定存在以下情况:一个中心数据结构(非常大的,所以我真的不希望把它一成不变的复制我甚至不想在内存中保留多个副本),多个读取器线程访问该数据结构只读,一个写入器线程保持数据结构在后台最新。
我目前同步所有访问的数据结构,这只是罚款(不同步效应,不死锁)。我不喜欢这种方法的是,大多数情况下,我有很多读者线程处于活动状态,写入程序线程只是偶尔活动。现在阅读器线程完全不需要等待其他阅读器线程完成。只要写入线程当前未写入,他们可以轻松地并行访问数据结构。
有没有一个很好的和优雅的方式来解决这种情况?
编辑:非常感谢你的答案和链接!让我再添加一个简短的相关问题:如果在读者的关键部分中执行的代码只需要很短的时间(就像查找哈希表一样),那么是否值得考虑实现您描述的技术之一或者是序列化在这种情况下锁的效果不是很差?可伸缩性和性能非常重要。你怎么看?
编辑2:我刚刚查看了一个作家/多读者的一个实现 - 锁定和此实现使用监视器来同步WaitToRead方法中的一些代码。这不会造成我想避免的序列化效应吗? (仍然假定要同步的代码是短而快的)
Jeffrey Richter正在讨论.NET库中ReaderWriterLock的实现。他本人在同一篇文章中介绍了这种锁的高效实现。但是,谢谢!我有点害怕没有明确的答案;) – jpfollenius 2009-03-06 10:38:00
@Smasher:确实。然而,在VCL中实施MREW存在问题,人们并不真正相信它。 Jeffrey Richter一直在做这个东西超过15年,我相信他的判断和实施。试着通知你正在进入的内容。 – mghie 2009-03-06 10:46:02