@Wing0

Закрывается программа при Parallel.For?

Здравствуйте, есть программа, рассчитывающая траекторию объекта. Из-за долгого расчета использовал Parallel.For, но программа стала просто закрываться (чаще всего без ошибки). Кто знает в чем ошибка?
private void выполнитьРасчетToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            //System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
            Random rand = new Random();
            var ob = new object();
            var before = DateTime.Now;
            List = new List<double[]>();
            Parallel.For(0, Prec, val =>
            {
                double b;
                double c;
                double d = 0;//theta1
                double m = 0;//phi1
                double f = 0;
                double g = 0;//theta2
                double h = 0;//phi2
                double i1 = 0;
                double k = 0;
                int l = 0;
                for (b = rand.Next() % 900 / 10.0, c = rand.Next() % 3600 / 10.0; (Math.Abs(c - 180.0) / 180.0 > Math.Sin(b * Math.PI / 180.0)); b = rand.Next() % 900 / 10.0, c = rand.Next() % 3600 / 10.0) ;
                c = 180.0 + (c - 180.0) / Math.Sin(b * Math.PI / 180.0);
                dllsub(ref A, ref b, ref c, out d, out m, out f, out g, out h, out i1, out k, out l);
                if (g > ThetaO - Aamp && g < ThetaO + Aamp)
                {
                    lock (List)
                    {
                        List.Add(project(d, m, g, h, A, f, h));
                    }
                }
            });
            double mit = MinT(List);
            for (int i = 0; i < List.Count; i++) List[i][2] = Time(List[i][3], List[i][2] - mit, A);
            List.Sort(new QuantComparer());
            this.Refresh();
            foreach (double[] a1 in DrawL) richTextBox1.Text = richTextBox1.Text + (int)Math.Round(a1[0]) + "\t" + (int)Math.Round(a1[1]) + "\t" + Math.Round(a1[2]) + "\n";
        }

Иногда выскакивает такая ошибка: Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена.
В окне вывода пишет все непонятное, кроме этого: The program '[7132] WindowsFormsApplication2.vshost.exe: Managed (v4.0.30319)' has exited with code 127 (0x7f).
dllsub - процедура на fortran'e, с помощью которой мы получаем координаты тела. Их мы записываем в список.
  • Вопрос задан
  • 193 просмотра
Решения вопроса 1
lasalas
@lasalas
.NET Architect
Скорей всего трапается в неуправляемом коде, который, вероятно, не поддерживает многопоточность. Можно попробовать поставить глобальный lock на вызов dllsub(), чтобы убедиться.
Стиль кода - отстой.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
dasha_programmist
@dasha_programmist
ex Software Engineer at Reddit TS/React/GraphQL/Go
первое: никогда не используй класс рандома из нескольких потоков, он непотокобезопасный и иногда (на практике при высокой частоте генерации) экземпляр "ломается" и начинает всегда выдавать 0
второе: остается загадкой метод dllsub, project, поскольку они используют внешние переменные - это важно
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы