C# потокобезопасный быстрый (est) счетчик
Как получить потокобезопасный счетчик в C# с наилучшей возможной производительностью?
Это так просто, как он получает:
public static long GetNextValue()
{
long result;
lock (LOCK)
{
result = COUNTER++;
}
return result;
}
но есть ли более быстрые альтернативы?
4 ответа:
как рекомендовано другими,
Interlocked.Increment
будет иметь лучшую производительность, чемlock()
. Просто взгляните на IL и сборки, где вы увидите, чтоIncrement
превращается в оператор" блокировка Шины", и его переменная непосредственно увеличивается (x86) или" добавляется " к (x64).этот оператор "Bus lock" блокирует шину, чтобы предотвратить доступ другого процессора к шине, пока вызывающий процессор выполняет свою работу. Теперь взгляните на C#
lock()
оператор IL. Здесь вы увидите призывы кMonitor
для того, чтобы начать или закончить раздел.другими словами, .Net
lock()
оператор делает намного больше, чем .NetInterlocked.Increment
.Итак, если все, что вы хотите сделать, это увеличить переменную,
Interlock.Increment
будет быстрее. Просмотрите все взаимосвязанные методы, чтобы увидеть различные доступные атомарные операции и найти те, которые удовлетворяют вашим потребностям. Используйтеlock()
когда вы хотите делать более сложные вещи, такие как несколько взаимосвязанных приращений/уменьшений, или сериализовать доступ к ресурсы, которые являются более сложными, чем целые.
Я предлагаю вам использовать встроенный в приращение блокировки .NET в системе.Потоковая библиотека.
следующий код будет увеличивать длинную переменную по ссылке и полностью потокобезопасен:
Interlocked.Increment(ref myNum);
Источник:http://msdn.microsoft.com/en-us/library/dd78zt0c.aspx
попробовать сблокированы.Инкремент