Почему не работает инкремент в многопоточном коде? - 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();
}
}