多线程访问C#字典

时间:2012-03-30 22:11:50

标签: c# multithreading dictionary

我理解C#词典在添加,读取和删除元素方面不是线程安全的;但是,如果另一个线程正在编写,读取和从字典中删除,您是否可以以线程安全的方式访问C#字典的Count属性?

6 个答案:

答案 0 :(得分:4)

它应该是线程安全的,因为它不会爆炸,但我很确定它不是线程安全的,因为其他线程操纵字典可能无法给你正确的计数。

[编辑:正如usr指出的那样,仅仅是因为它目前在这个级别的线程安全并不意味着它将继续如此。你没有保证]

答案 1 :(得分:2)

由于属性是引擎盖罩下的方法调用所以真的情况并不像乍一看那么简单。

  • T1:访问Count属性
  • T1:get_Count()调用(某种JMP / GOTO ASM指令)
  • T1:读取变量,表示多个项目== 1
  • T2:添加新项目,实数变为2
  • T1:返回1,但实际上已有两项

因此,如果应用程序逻辑依赖于Count属性值 - 理论上你最终会得到race condition

答案 2 :(得分:1)

第一:这是一种危险的想法。如果你把这样的东西投入生产,要非常小心。也许你应该只使用一个锁或ConcurrentDictionary。

你对一个近似的答案感到满意吗?

但是:Reflector显示count只读取一些字段并返回它。这可能不会永远改变。所以你在这种情况下可以合理地承担风险。

答案 3 :(得分:0)

您可以将字典创建为静态只读对象,并在修改它时lock ...它应该处理大多数问题,我想。

答案 4 :(得分:0)

根据您要实现的目标,您可以使用ReaderWriterLockSlim保护字典。这样,您可以更快地读取并且仅在执行变异操作时锁定字典。

答案 5 :(得分:0)

我没有假设,而是在反射器中看着它:

public int Count
{
    get
    {
        // count and freeCount are local fields
        return (this.count - this.freeCount);
    }
}

所以是的,它是“线程安全的”,因为访问它不会导致字典对象中的损坏。也就是说,我不确定我能否想到任何用例,如果另一个线程正在访问字典,那么以任何准确度计数都很重要。