Синхронизация потоков: проблема гонки потоков - C#
Формулировка задачи:
Есть проблема в синхронизации потоков, которую я не знаю, как решить. Точнее у меня получается типичная гонка потоков.
Есть функция, которая меняет статический массив. Если два массива (а и б) равны, то поток завершает выполнение.
Вот сам код функции:
В чем казус? Когда один поток находится в лок, а другой в самом начале функции, первый успевает завершить действие (выходит из цикла), а второй в этот момент меняет значение, и получается условие не равно, и все...Как решить данную проблему, кто подскажет?
static void func(double[] arr)
{
Random rd = new Random();
bool fl = true;
while (fl)
{
//Случайно выбираем элемент массива
int index = rd.Next(0, arr.Length);
//Если 0, то мы обнуляем элемент, если 1, то умножаем на произвольное число от 1 до 10.
int flag = rd.Next(0, 1);
int number = rd.Next(1, 10);
arr[index] = (flag == 0) ? 0 : arr[index] * number;
lock (locker)
{
if (Sum(a) == Sum(b)) fl = false;
}
}
}Решение задачи: «Синхронизация потоков: проблема гонки потоков»
textual
Листинг программы
private static bool _isEqual = false;
static void func(double[] arr)
{
Random rd = new Random();
bool fl = true;
while (!_isEqual )
{
//Случайно выбираем элемент массива
int index = rd.Next(0, arr.Length);
//Если 0, то мы обнуляем элемент, если 1, то умножаем на произвольное число от 1 до 10.
int flag = rd.Next(0, 1);
int number = rd.Next(1, 10);
lock (locker)
{
if(!_isEqual)
{
arr[index] = (flag == 0) ? 0 : arr[index] * number;
if (Sum(a) == Sum(b)) _isEqual = true;
}
}
}
}