Загрузка...

Потокобезопасное увеличение int переменной C#

Тема в разделе C# создана пользователем RaysMorgan 7 янв 2017. 948 просмотров

Загрузка...
  1. RaysMorgan
    RaysMorgan Автор темы 7 янв 2017 https://lolz.live/support-tickets/open 51 794 7 мар 2013
    Во многих ****ах есть такая операция, как увеличение счётчика, например "количество проверенных" или "количество гудов".
    В качестве примеров будем использовать переменную count_checked
    Для начала рассмотрим печальный вариант, но все же встречающийся в проектах иногда:
    Код

    count_checked++;

    Эта операция не потокобезопасна! Так писать нельзя.

    Более продвинутые пользователи используют оператор lock:
    В начале класса создают объект
    Код

    Object lockThis = new Object();

    И где-то внутри метода пишут что-то подобное:
    Код

    lock (lockThis) {
    count_checked++;
    }

    Это рабочий вариант, но устаревший и не производительный.

    Для быстрого и безопасного увеличения счетчика (+1) используйте оператор Interlocked.Increment
    Код
    Interlocked.Increment(ref this.count_checked);

    Вместо count_checked пишите свою переменную.

    Также имеется аналогичный оператор Interlocked.Decrement для уменьшения счётчика на единицу (-1)
    Код
    Interlocked.Decrement(ref this.count_lost);

    Вместо count_lost (типо "сколько осталось") пишите свою переменную.
     
  2. iPro_inactive
    iPro_inactive 31 янв 2017 Заблокирован(а) 30 15 июн 2016
    Шта? Кейворд lock это синтаксический сахарок над типом Monitor, и я бы поспорил что вариант через Interlocked работает быстрее, ибо значимый тип передается по ссылке, а boxing/unboxing одна из самых ресурсоемких операций при работе с различными типами в C#
     
Top