DO C # 4.0 Спин / блок BCL Scorlock, когда они не могут получить замок?

StackOverflow https://stackoverflow.com/questions/3178585

  •  02-10-2019
  •  | 
  •  

Вопрос

Учитывая следующий код:

...
private static SpinLock logLock = new SpinLock(false);
...

private static void ThreadFunc()
{
    bool lockTaken = false;
    logLock.Enter(ref lockTaken)
    {
        try
        {
            // do stuff with during an acquired SpinLock
        }
        finally
        {
            logLock.Exit();
        }
    }
}

Если введите блок «не удается», потому что он получает FALSE на полученном замке, содержится ли текущий поток, как спин как спин и дождается дождь, пока он не будет получать его, либо этот блок просто обойден, и этот нить не теряет?

Спасибо,

Соревнование

Это было полезно?

Решение

Спинлок по определению приводит к спину потока, ожидая приобретения для блокировки, а не блокировки. Войти не «не удается», если он не может приобрести замок, он просто ждет.

Единственный случай, когда ввод может завершиться бросать исключение, когда владение потоком активирована, используя новый SpinLock (), либо новый спинлок (True). В этом случае исключение брошено, когда нить пытается приобрести блокировку, которое она уже владеет. В вашем случае это никогда не произойдет, потому что вы создали замок с отслеживанием отключения (SpinLock (False)). Если нить пытается повторно получить замок, он будет просто тупиком.

SpinLock.enter. метод.

Другие советы

А. Спинлок в основном просто петля вокруг пытается установить переменную к определенному значению.

Вы можете рассмотреть его реализацию следующим образом:

public struct SpinLock
{
    private volatile bool _Locked;

    public void Acquire()
    {
        while (_Locked)
            ;
        _Locked = true;
    }

    public void Release()
    {
        _Locked = false;
    }
}

(Конечно, вышеуказанный код не безопасен в потоке, и я знаю, что это не подпись методов класса, это просто вариант псевдокода, чтобы показать, что он делает)

Итак, да, если спинлок уже находится в заблокированном состоянии, пытаясь приобрести его вращаться, пока оно не будет доступен.

Также обратите внимание, что по умолчанию (как в вашем примере) структура не отслеживает, кому принадлежит блокировку. Это означает, что если нить пытается привлечь замок дважды, она будет тупичным с собой во второй попытке.

Целью SpinLock - это замок уровня пользователя с небольшим количеством накладных расходов. Он не добавляет давление GC, а также не распределяет любой объект синхронизации ядра, это просто структура с несколькими полями.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top