C# потокобезопасный быстрый (est) счетчик


Как получить потокобезопасный счетчик в C# с наилучшей возможной производительностью?

Это так просто, как он получает:

public static long GetNextValue()
{
    long result;
    lock (LOCK)
    {
        result = COUNTER++;
    }
    return result;
}

но есть ли более быстрые альтернативы?

4 88

4 ответа:

Это было бы проще:

return Interlocked.Increment(ref COUNTER);

MSDN заблокирован.Инкремент

как рекомендовано другими,Interlocked.Increment будет иметь лучшую производительность, чем lock(). Просто взгляните на IL и сборки, где вы увидите, что Increment превращается в оператор" блокировка Шины", и его переменная непосредственно увеличивается (x86) или" добавляется " к (x64).

этот оператор "Bus lock" блокирует шину, чтобы предотвратить доступ другого процессора к шине, пока вызывающий процессор выполняет свою работу. Теперь взгляните на C# lock() оператор IL. Здесь вы увидите призывы к Monitor для того, чтобы начать или закончить раздел.

другими словами, .Net lock() оператор делает намного больше, чем .Net Interlocked.Increment.

Итак, если все, что вы хотите сделать, это увеличить переменную,Interlock.Increment будет быстрее. Просмотрите все взаимосвязанные методы, чтобы увидеть различные доступные атомарные операции и найти те, которые удовлетворяют вашим потребностям. Используйте lock() когда вы хотите делать более сложные вещи, такие как несколько взаимосвязанных приращений/уменьшений, или сериализовать доступ к ресурсы, которые являются более сложными, чем целые.

Я предлагаю вам использовать встроенный в приращение блокировки .NET в системе.Потоковая библиотека.

следующий код будет увеличивать длинную переменную по ссылке и полностью потокобезопасен:

Interlocked.Increment(ref myNum);

Источник:http://msdn.microsoft.com/en-us/library/dd78zt0c.aspx