Почему не работает инкремент в многопоточном коде? - C#

Узнай цену своей работы

Формулировка задачи:

Имеем такой код, который вызывает два потока, в асинхронном режиме, которые изменяют одну переменную, которая передаётся по ссылке.
 class Program
    {
        delegate void DelegateWithRef(ref int x);
        public static void Increament(ref int x)
        {
            for (int i = 0; i < 50; i++)
                x++;
        }
 
        static void Main(string[] args)
        {
            int x = 0;
            DelegateWithRef del = Increament;
            IAsyncResult[] iAsResult = new IAsyncResult[2];
            for (int i = 0; i < 2; i++)
                iAsResult[i] = del.BeginInvoke(ref x, null, null);
            while (!(iAsResult.Select(res => res.IsCompleted).Count(res => res == true) == 2)) { }
            Console.WriteLine("x = {0}", x);
            Console.ReadLine();
        }
    }
Но, в результате имеем 0 на выходе. Теоретически переменную нужно синхронизировать, но с другой стороны, одновременно её увеличивает только один поток, так что этот момент пока опустим. Кто знает, почему не выполняется инкрементация?

Решение задачи: «Почему не работает инкремент в многопоточном коде?»

textual
Листинг программы
 static void Main(string[] args)
    {
        int x = 0;
        DelegateWithRef del = Increament;
        IAsyncResult[] iAsResult = new IAsyncResult[2];
        for (int i = 0; i < iAsResult.Length; i++)
        {
            iAsResult[i] = del.BeginInvoke(ref x, null, null);
            del.EndInvoke(ref x,iAsResult[i]);
        }
 
 
        while (iAsResult.All(result => result.IsCompleted==false))
        {
            Console.Write('*');
        }
        Console.WriteLine("x = {0}", x);
        Console.ReadKey();
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 4.3 из 5