Я пытаюсь внедрить потокобезопасный пул ресурсов, к которому можно получить быстрый доступ и который получает только случайные обновления.Для этого я использую 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 вообще не спит и только вращается в течение короткого времени.Есть ли способ улучшить использование и сократить время ожидания?