我正在尝试实现一个可快速访问且仅偶尔更新的线程安全资源池。为此,我使用带有扩展方法的 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 根本不会睡觉,只会旋转一小段时间。有没有办法提高利用率并减少等待时间?