Проблема с многопоточностью: вычисление интеграла дает случайные значения - C#

Узнай цену своей работы

Формулировка задачи:

Есть следующая задача, решить интеграл методом прямоугольников используя многопоточность. Я попытался решить задачу следующим образом:
static void Main(string[] args)
        {
            double[] resarr = new double[20];
            const double b = 0.785;
            const double a = -1.04;
            int num;
            double[] arr = new double[20];
            Console.Write("Enter number of threads ->");
            num = Convert.ToInt32(Console.ReadLine());
            double interv = (b - a) / num;
            for (int i = 0; i <= num; i++)
            {
                arr[i] = a + i * interv;
            }
            Thread[] t = new Thread[num+1];
            for (int i = 1; i <= num; i++)
            {
                Thread thr = new Thread(delegate() {Rect(arr[i-1], arr[i],0.0001,resarr,i); });
                t[i] = thr;
                t[i].Start();
            }
            for (int i = 1; i <= num; i++)
            {
                t[i].Join();
            }
            for (int i = 0; i <= num; i++)
            {
                resarr[num + 1] += resarr[i];
            }
            Console.Write(resarr[num + 1]);
            Console.ReadKey();
        }
 
static void Rect(double a, double b, double e, double[] sarr, int num)
        {
            int n=2;
            double Jn,x,s;
            double Jn1=0;
            do
            {
                double h = (b-a)/n;
                x = a + h;
                s = 0;
                for (int i = 0;i<=(n-1);i++)
                {
                        double f = fu(x);
                        s = s+f;
                        x = x+h;
                }
                Jn = s*h;
                if (Math.Abs(Jn1-Jn)<=e)
                {
                    sarr[num] = Jn;
                    return;
                }
                else
                {
                        Jn1 = Jn;
                        n = 2*n;
                }
            }
            while (true);
        }
        static double fu(double x)
        {
            double rez = Math.Cos(1.3 * x)/(1+Math.Cos(1.3*x));
            return rez;
        }
Проблема в том что при ручной отладке и соответственно длительном времени выполнения каждого потока, программа выдаёт правильный результат. Но в случае если производится обычный запуск, программа выдаёт случайное значение. Насколько я понимаю здесь имеют место гонки потоков. Только не могу понять где и за какие ресурсы. Помогите пожалуйста решить проблему. P.S. решение с последовательным выполнением каждого потока не подходит, необходимо одновременное выполнение определённого числа потоков.

Решение задачи: «Проблема с многопоточностью: вычисление интеграла дает случайные значения»

textual
Листинг программы
int x = i;
Thread thr = new Thread(delegate() {Rect(arr[x-1], arr[x],0.0001,resarr,x); });

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


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

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

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