Загрузка...

Thread safe increment of int variable C #

Thread in C# created by RaysMorgan Jan 7, 2017. 965 views

  1. RaysMorgan
    RaysMorgan Topic starter Jan 7, 2017 Че скажете 53,985 Mar 7, 2013
    Во многих ****ах есть такая операция, как увеличение счётчика, например "количество проверенных" или "количество гудов".
    В качестве примеров будем использовать переменную count_checked
    Для начала рассмотрим печальный вариант, но все же встречающийся в проектах иногда:
    Code

    count_checked++;

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

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

    Object lockThis = new Object();

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

    lock (lockThis) {
    count_checked++;
    }

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

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

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

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

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