【发布时间】:2011-08-04 02:19:46
【问题描述】:
在我的应用程序中,我管理一组锁,我需要序列化对某些对象的访问(每个对象都分配有一个锁)。这个锁集合(锁管理器)也需要以线程安全的方式维护(添加新锁/删除旧锁,因为添加/删除需要序列化的新对象)。 该算法的工作原理如下:
LockManager.Lock();
var myLock = LockManager.FindLock(myObject);
LockManager.Unlock(); // atomic
myLock.Lock(); // atomic
交换两行不是一个好的解决方案。如果myLock 的锁定会阻塞,那么这也会阻止LockManager 的解锁,从而请求其他锁阻塞。
我需要的是两条标记的行以原子方式执行。有没有办法做到这一点?
【问题讨论】:
-
为什么不先拿锁再解锁经理?
-
为什么不使用另一个锁。 makethisactionatomic 锁。
-
@CodeInChaos:如果其他锁被阻塞,那么第一个锁的释放也会在这段时间内被阻塞。
-
@dcarapic 你的管理器和对象锁应该是独立的,交换最后两行,如果你不能这样做,那么你可能在代码中有错误。请发布经理和对象的锁定和解锁代码。
-
@oleksii 交换两行并不是一个好的解决方案。如果 myLock 的锁定会阻塞,那么这也会阻塞 LockManager 的解锁,请求其他锁阻塞: LockManager.Lock(); var myLock = LockManager.FindLock(myObject); myLock.Lock(); // 如果因为锁已经被占用而阻塞 LockManager.Unlock(); // 那么这也会被阻塞
标签: c# .net multithreading