关于锁策略的问题(c# / . net 3.5 SP1)
本文关键字:net SP1 策略 于锁 问题 | 更新日期: 2023-09-27 18:03:38
我需要写一个类,持有作为字典。字典将被多个线程访问。每次访问将非常短。
我希望:
- 每分钟一次添加或删除条目的访问
- 每2秒,我需要创建一个字典的副本。对它进行检查(然后调用DB)
- 每秒多次,我将值的字段更新为其中一个键。
你会选择哪种锁策略,为什么?我的第一个尝试是使用ReaderWriterLockSlim。但是在我读到它至少比Monitor慢两倍之后,我就不那么确定了,因为每次我访问字典时,我都会锁定很短的时间。
tia马丁
考虑到最频繁的操作是写入,并且就我所见,您永远不需要多个并发的读取器,我将只使用普通锁。我看不出ReaderWriterLockSlim
对你有什么帮助,而且它肯定会给你更复杂的代码。
编辑:一个可能的优化是只访问写线程的更改列表。然后,在处理列表之前更新底层字典时,读取线程需要锁定列表。假设字典非常大,但更改列表相对较小,这意味着写入线程将阻塞更短的时间。
实际上,您可以使用Queue
之类的东西来代替列表,并可能使读线程对小批量的队列进行解列并yield,从而进一步减少写线程的延迟——因此,如果有100个更改要处理,读线程可能会读取其中的10个,yield,以便任何阻塞等待添加到队列的写线程可以得到它们的轮到。
有更复杂的解决方案,这取决于性能的关键程度,特别是在延迟方面-但我将从字典的锁开始。