Синхронизация потоков: проблема гонки потоков - 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;
                    }
                }
            }      
        }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 4.222 из 5
Похожие ответы