【问题标题】:Question about locking strategy (C# / .NET 3.5 SP1)关于锁定策略的问题(C# / .NET 3.5 SP1)
【发布时间】:2011-10-12 08:27:31
【问题描述】:

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

我希望:

  • 每分钟都有一个访问增加或删除条目
  • 每 2 秒。我需要创建该字典的副本。对其进行检查(然后例如调用数据库)
  • 每秒多次我将值的字段更新为其中一个键。 (value 是一个结构体)不会同时访问同一个键。

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

tia 马丁

【问题讨论】:

  • .NET 4.0 具有线程安全的 ConcurrentDictionary 类。

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


【解决方案1】:

鉴于最频繁的操作是写入,而且据我所知,您永远不需要多个并发读取器,我只会使用普通锁。我看不出ReaderWriterLockSlim 会帮助你,它肯定会给你更复杂的代码。

编辑:一种可能的优化是只访问来自写入线程的更改列表。然后,读取线程将需要锁定该列表just,同时它会在处理它之前更新底层字典。假设字典非常大,但更改列表相对较小,这意味着写入线程将被阻塞的时间要少得多。

事实上,您可以使用 Queue 之类的东西来代替列表,并可能使读取线程出列小批量并产生,从而进一步减少写入线程的延迟 - 因此,如果要处理 100 个更改,读取线程可能会读取其中的 10 个,yield 以便任何阻塞等待添加到队列的写入线程都可以轮到它们。

对此有更复杂的解决方案,具体取决于性能的重要性,特别是在延迟方面 - 但我会从锁定字典开始。

【讨论】:

  • 但是鉴于他需要每 2 秒从字典中复制(=读取)一次,那么简单的锁不会有更大的开销吗?
  • @sternr:为什么?锁定本身很便宜——复制会很慢,你无法避免这种情况。在复制您使用的任何锁定策略时,您将无法进行任何写作。
  • @sternr: AFAIK lockReaderWriterLockSlim 快​​
  • 很抱歉,我的描述不够详细。每秒发生多次的访问永远不会同时影响同一个密钥。我有点担心总是锁定整个字典只是为了更新值结构中的时间戳,会创建一个锁护卫队。
猜你喜欢
  • 2010-12-18
  • 2011-07-01
  • 2010-11-23
  • 2012-03-27
  • 2010-09-19
  • 1970-01-01
  • 1970-01-01
  • 2010-10-30
  • 2015-10-25
相关资源
最近更新 更多