Проблема с многопоточностью: вычисление интеграла дает случайные значения - 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); });