Проблема с многопоточностью: вычисление интеграла дает случайные значения - C#
Формулировка задачи:
Есть следующая задача, решить интеграл методом прямоугольников используя многопоточность.
Я попытался решить задачу следующим образом:
Проблема в том что при ручной отладке и соответственно длительном времени выполнения каждого потока, программа выдаёт правильный результат. Но в случае если производится обычный запуск, программа выдаёт случайное значение. Насколько я понимаю здесь имеют место гонки потоков. Только не могу понять где и за какие ресурсы.
Помогите пожалуйста решить проблему.
P.S. решение с последовательным выполнением каждого потока не подходит, необходимо одновременное выполнение определённого числа потоков.
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; }
Решение задачи: «Проблема с многопоточностью: вычисление интеграла дает случайные значения»
textual
Листинг программы
int x = i; Thread thr = new Thread(delegate() {Rect(arr[x-1], arr[x],0.0001,resarr,x); });
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д