gpt4 book ai didi

C# - 从字典中获取资源时锁定

转载 作者:行者123 更新时间:2023-11-30 15:12:16 24 4
gpt4 key购买 nike

我有一个跟踪对象 (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()

是的,您应该在任何改变对象状态的操作之前进行锁定。

附带说明 - 您确定此设置是解决您问题的最佳方案吗?跨线程共享的可变对象往往会产生比它们解决的问题更多的问题。

关于C# - 从字典中获取资源时锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1482783/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com