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

感兴趣