C# 仅在某些情况下为线程锁定对象
C# Locking object for threads only in certain cases
假设我有两个线程,我希望能够访问一个对象,但如果第三个线程正在使用它则不能(反之亦然)。我能做的是使用 2 个锁:
线程 A:
lock(object1)
{
// do work
}
线程 B:
lock(object2)
{
// do work
}
线程 C:
lock(object1)
{
lock(object2)
{
// do work
}
}
是否有更好的方法,或者这是正确的方法?
一种可能是使用 ReaderWriterLockSlim。如果您将线程 A 和 B 视为读者,那么如果线程 C 未使用它,则它们可以并发读取。而线程C可以获得写锁等待A和B退出,防止他们在C为运行.
时获取到锁
示例:
在外部范围:
ReaderWriterLockSlim rwLock = new ReaderWriterLockSlim();
线程 A 和 B:
rwLock.EnterReadLock();
try
{
// do stuff
}
finally
{
rwLock.ExitReadLock();
}
线程 C:
rwLock.EnterWriteLock();
try
{
// do stuff
}
finally
{
rwLock.ExitWriteLock();
}
您可能还对ReaderWriterLock
感兴趣
假设我有两个线程,我希望能够访问一个对象,但如果第三个线程正在使用它则不能(反之亦然)。我能做的是使用 2 个锁:
线程 A:
lock(object1)
{
// do work
}
线程 B:
lock(object2)
{
// do work
}
线程 C:
lock(object1)
{
lock(object2)
{
// do work
}
}
是否有更好的方法,或者这是正确的方法?
一种可能是使用 ReaderWriterLockSlim。如果您将线程 A 和 B 视为读者,那么如果线程 C 未使用它,则它们可以并发读取。而线程C可以获得写锁等待A和B退出,防止他们在C为运行.
时获取到锁示例:
在外部范围:
ReaderWriterLockSlim rwLock = new ReaderWriterLockSlim();
线程 A 和 B:
rwLock.EnterReadLock();
try
{
// do stuff
}
finally
{
rwLock.ExitReadLock();
}
线程 C:
rwLock.EnterWriteLock();
try
{
// do stuff
}
finally
{
rwLock.ExitWriteLock();
}
您可能还对ReaderWriterLock
感兴趣