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

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

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

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

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

textual
Листинг программы
  1.  static void Main(string[] args)
  2.     {
  3.         int x = 0;
  4.         DelegateWithRef del = Increament;
  5.         IAsyncResult[] iAsResult = new IAsyncResult[2];
  6.         for (int i = 0; i < iAsResult.Length; i++)
  7.         {
  8.             iAsResult[i] = del.BeginInvoke(ref x, null, null);
  9.             del.EndInvoke(ref x,iAsResult[i]);
  10.         }
  11.  
  12.  
  13.         while (iAsResult.All(result => result.IsCompleted==false))
  14.         {
  15.             Console.Write('*');
  16.         }
  17.         Console.WriteLine("x = {0}", x);
  18.         Console.ReadKey();
  19.     }
  20. }

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


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

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

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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут