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