我有一个跟踪对象的字典(ClientObject).字典和ClientObject都可以通过多个线程访问.当我修改或读取此字典中的任何对象时,我使用ReaderWriterLockSlim(rwl_clients)在字典上获得了读取或写入锁,然后在实际对象上获得了排他锁.
我只是想知道我是否正确使用了这些.net线程工具
例:
rwl_clients.EnterReadLock();
ClientObject clobj;
if(!m_clients.TryGetValue(key, out clobj))
return;
rwl_clients.ExitReadLock();
SomeMethod(clobj);
SomeMethod(ClientObject clobj)将执行以下操作:
lock(clobj) {
/// Read / Write operations on clobj
}
从一个线程中的字典中获取和锁定值(ClientObject)是否意味着其他线程会尊重该锁定?换句话说,.net是否将字典中的值视为单个资源(而不是副本),因此将在所有线程中尊重对该资源的锁定?
从字典中删除资源时,还有一个问题-在执行Remove()之前应该锁定它吗?
例:
rwl_clients.EnterWriteLock();
ClientObject clobj;
if(m_clients.TryGetValue(key, out clobj)) {
lock(clobj) {
m_clients.Remove(key);
}
}
rwl_clients.ExitWriteLock();
我从该站点学到了很多东西,感谢您的答复!
谢谢.
解决方法:
Does getting and locking a value (ClientObject) from the dictionary in one thread mean that other threads will respect that lock? In other words, does .net see a value in the dictionary as a single resource (and not a copy) and will therefore respect a lock on that resource in all threads?
这取决于类型-如果是引用类型,则是,如果是值类型,则是.这也是为什么永远不要锁定值类型的原因,因为该值类型将被装箱,并且随后对该值进行锁定的任何尝试实际上都将获得对另一个对象的锁定.
One more question, when removing a resource from the dictionary – should I lock it before performing Remove()
是的,您应该在任何更改对象状态的操作之前锁定.
附带说明-您确定此设置是解决问题的最佳方法吗?跨线程共享的可变对象往往会解决更多问题.