关于锁定策略的问题(C#/ .NET 3.5 SP1)

时间:2011-07-25 06:32:02

标签: c# .net multithreading .net-3.5

我需要编写一个保存为Dictionary的类。字典将由多个线程访问。 每次访问都会很短。

我期待:

  • 每分钟添加或删除条目的访问
  • 每2秒我需要创建该dict的副本。运行检查(然后再调用数据库)
  • 每秒多次,我将值的一个字段更新为其中一个键。 (value是结构)不会同时访问相同的密钥。

您会选择哪种锁定策略?为什么? 我的第一个镜头是使用ReaderWriterLockSlim。但是在我阅读它之后,它比Monitor慢了至少两倍,我不再那么确定了,因为每次我访问dict时,我都会锁定很短的时间。

TIA 马丁

1 个答案:

答案 0 :(得分:3)

鉴于最常见的操作是编写而且你从不需要多个并发的读者,据我所知,我只会使用普通的锁。我看不出ReaderWriterLockSlim会对你有所帮助,它肯定会给你更复杂的代码。

编辑:一种可能的优化是只从写入线程访问更改列表。然后,读取线程需要在处理它之前更新基础字典时锁定该列表 。假设字典非常大但是更改列表相对较小,这意味着写入线程将被阻止更短的时间。

实际上,您可以使用Queue之类的内容而不是列表,并且可能使读取线程出现小批量并产生,从而进一步减少写入线程的延迟 - 因此如果有100个更改进程中,读取线程可能会读取其中的10个,这样可以使得任何阻塞等待添加到队列中的写入线程可以轮到他们。

对此有更复杂的解决方案,具体取决于性能的重要程度,特别是在延迟方面 - 但我首先只是锁定字典。