Почему ReaderWriterLockSlim вызывает Sleep () внутри EnterReadLock ()? - PullRequest
1 голос
/ 08 апреля 2019

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

1 Ответ

1 голос
/ 08 апреля 2019

Тонкие версии потоковых компонентов используют спин-блокировки, которые бывают быстрыми, но интенсивно используют процессор. Если вы ожидаете какого-либо ожидания, используйте более старый ReaderWriterLock.

...