1

我正在尝试实现一个可快速访问且仅偶尔更新的线程安全资源池。为此,我使用带有扩展方法的 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();
    }
}

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

4

1 回答 1

2

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

于 2019-04-08T15:07:16.833 回答