C#,。Net2.0,XP,Zen
我有2个线程访问结构的共享字典,每个线程通过一个事件。 在事件开始时我锁定字典,删除一些结构,然后退出lock +事件。 然而,不知何故,第二个线程|事件是找到一些被删除的结构。
从概念上讲,我必须为此做错事吗?我认为锁定应该使其线程安全吗?
答案 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)
我可以在不看代码的情况下建议两件事:
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命名空间中的某些内容,则可能不需要锁定。