Почему не работает инкремент в многопоточном коде? - 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(); } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д