Почему не работает инкремент в многопоточном коде? - C#
Формулировка задачи:
Имеем такой код, который вызывает два потока, в асинхронном режиме, которые изменяют одну переменную, которая передаётся по ссылке.
Но, в результате имеем 0 на выходе. Теоретически переменную нужно синхронизировать, но с другой стороны, одновременно её увеличивает только один поток, так что этот момент пока опустим. Кто знает, почему не выполняется инкрементация?
Листинг программы
- 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();
- }
- }
Решение задачи: «Почему не работает инкремент в многопоточном коде?»
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();
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д