另一个同步问题......我希望你们不要生气;)
假设以下场景:一个中央数据结构(非常大,所以我真的不想让它变得不可变并且每当发生更改时都会复制它.我甚至不想在内存中保留多个副本),多个读取器线程访问该数据结构只读和一个编写器线程,使数据结构在后台保持最新.
我目前同步所有对数据结构的访问,这很好地工作(没有同步效果,没有死锁).我不喜欢这种方法的是,大多数时候我有很多读者线程处于活动状态,编写器线程只是偶尔活跃.现在,读者线程完全没有必要等待其他读者线程完成.只要编写器线程当前没有写入,他们就可以轻松地并行访问数据结构.
有没有一种漂亮而优雅的方式来解决这种情况?
编辑:非常感谢您的答案和链接!让我添加另一个简短且相关的问题:如果在读者的关键部分中执行的代码只需要很短的时间(就像只是哈希表查找),是否值得考虑实现您描述的技术之一或者是序列化在这种情况下锁的效果不是那么糟糕?可伸缩性和性能非常重要.你怎么看?
编辑2:我刚看了一个单个writer/mulitple reader的实现 - 锁定,这个实现使用监视器来同步WaitToRead方法中的一些代码.这不会导致我想要首先避免的相同序列化效果吗?(仍假设要同步的代码短而快)
在RTL(sysutils)中有一个用于此目的的类:TMultiReadExclusiveWriteSynchroniser
这是非常容易使用.您不需要像读者或作者那样严格地对线程进行分类.只需在线程中调用"BeginRead"或"BeginWrite"即可启动线程安全操作.调用"EndRead"或"EndWrite"完成操作.
您正在寻找什么(以及vartec描述的内容)被称为Reader(s)-Writer-Lock.