为什么 ReaderWriterLockSlim 在 EnterReadLock() 内部调用 Sleep()?

Why does ReaderWriterLockSlim call Sleep() inside of EnterReadLock()?

我正在尝试实现一个线程安全的资源池,该资源池可以快速访问并且只偶尔更新。为此,我使用带有扩展方法的 ReaderWriterLockSlim 来进入和退出读锁。分析线程利用率出乎意料的低。

我确认没有写入池,因此从未调用 EnterWriteLock()。

internal Mesh GetMesh(string name)
{
    using (CacheLock.Read())
    {
        if (MeshDictionary.TryGetValue(name, out var m))
        {
            return m;
        }
    }
    // <snip>
}
public static ReadLock Read(this ReaderWriterLockSlim l)
{
    return new ReadLock(l);
}
internal class ReadLock : IDisposable
{
    private readonly ReaderWriterLockSlim _lockObject;
    public ReadLock(ReaderWriterLockSlim l)
    {
        _lockObject = l;
        l.EnterReadLock();
    }
    public void Dispose()
    {
        _lockObject.ExitReadLock();
    }
}

在进行性能分析时,我发现大多数线程在 EnterReadLock() 中花费了大约 25% 的时间。该功能的内部睡眠大约占 19%,其余时间用于主动旋转和其他开销。 我希望 EnterReadLock 根本不会休眠,只会旋转一小会儿。 有没有办法提高利用率并减少等待时间?

线程组件的 Slim 版本使用自旋锁,速度快但 CPU 密集。如果您希望等待任何持续时间,请使用较旧的 ReaderWriterLock。