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