锁定两个线程之间不起作用的结构字典?

时间:2011-01-13 04:56:07

标签: c# .net locking

C#,。Net2.0,XP,Zen

我有2个线程访问结构的共享字典,每个线程通过一个事件。 在事件开始时我锁定字典,删除一些结构,然后退出lock +事件。 然而,不知何故,第二个线程|事件是找到一些被删除的结构。

从概念上讲,我必须为此做错事吗?我认为锁定应该使其线程安全吗?

2 个答案:

答案 0 :(得分:0)

我没有发表评论的声誉 - 否则我会。

锁定确实有效,但这是常见的陷阱 -

你在锁什么?它总是与字典的相同实例吗? 锁定值类型不起作用 - 您只需锁定该框 - 然后另一个线程锁定另一个框。所以这段代码很糟糕:

int x;
void SomeThreadedfunc()
{
   lock((object)x) // does not work because x is boxed
   { 
      x++; 
   }
}

然而这有效:

object lockX = new object();
int x;
void SomeThreadedfunc()
{
   lock(lockX) // works 
   { 
      x++; 
   }
}

答案 1 :(得分:0)

我可以在不看代码的情况下建议两件事:

  1. 验证两种方法中是否使用了相同的锁定对象,例如如果你的lock语句锁定了一个本地线程的变量,它将无效。

  2. object _guard = new object();
    
    void threadMethod1()
    {
        lock(_guard) {...} //data is modified inside
    }
    
    void threadMethod2()
    {
        lock(_guard) {...} //data is modified inside
    }
    

    不喜欢这样:

    void threadMethod1()
    {
        lock(new object()) {...} //data is modified inside
    }
    
    void threadMethod2()
    {
        lock(new object()) {...} //data is modified inside
    }
    

    2根据您使用的.NET版本,如果您使用BlockingCollection或Parallel命名空间中的某些内容,则可能不需要锁定。