0

Есть проект программы которая сортирует большие списки строк, хотел его заставить заработать принципиально в многопоточном режиме (через Parallel не интересуют только через thred) но метод не запускается нормально и потоки странно работают, похоже что потоки не ожидают завершения друг друга или что то другое , не могу найти причину, подскажите в чем проблема тут? номера строк в метод: MyAction передаются через внешние переменные, блокировка в методе при сохранении и подсчете гудов тоже используется.Хотелось бы посмотреть ваши вариfнты на основе моего кода выше, как правильнее это реализовать через thred.

int potoky = 20;//количество потоков

Thread[] threadArrayD = new Thread[potoky];

DelimNumData = numbData;//тут общее количество строк который делится на количество потоков

    for (int q = 0; q < potoky; q++)
     {
         for (int l = 0; l < (DelimNumData / potoky); l++)
         {
             rest = (q * ((DelimNumData / potoky)) + l).ToString();
         }
     }
         dostroky = Convert.ToInt32(rest);

     for (int g = 0; g < potoky; g++)
     {
         threadArrayD[g] = new Thread(new ThreadStart(MyAction));//Запуск метода в отдельных потоках

         threadArrayD[g].IsBackground = true;
         threadArrayD[g].Name = g.ToString();
         threadArrayD[g].Start();
         threads.Add(threadArrayD[g]);
         Thread.Sleep(100);
     }
     foreach (Thread thred in threads)
     {
         thred.Join();
     }

Вот лог работы потоков:

[ThreadName]: 0[FULL_numdata]: 1566 [OT]: 0[DO]: 155[ITERASIYA]: 0
[ThreadName]: 1[FULL_numdata]: 1566 [OT]: 155[DO]: 311[ITERASIYA]: 155
[ThreadName]: 2[FULL_numdata]: 1566 [OT]: 311[DO]: 467[ITERASIYA]: 311
[ThreadName]: 3[FULL_numdata]: 1566 [OT]: 467[DO]: 623[ITERASIYA]: 467
[ThreadName]: 4[FULL_numdata]: 1566 [OT]: 623[DO]: 779[ITERASIYA]: 623
[ThreadName]: 5[FULL_numdata]: 1566 [OT]: 779[DO]: 935[ITERASIYA]: 779
[ThreadName]: 6[FULL_numdata]: 1566 [OT]: 935[DO]: 1091[ITERASIYA]: 935
[ThreadName]: 7[FULL_numdata]: 1566 [OT]: 1091[DO]: 1247[ITERASIYA]: 1091
[ThreadName]: 8[FULL_numdata]: 1566 [OT]: 1247[DO]: 1403[ITERASIYA]: 1247
[ThreadName]: 9[FULL_numdata]: 1566 [OT]: 1403[DO]: 1559[ITERASIYA]: 1403
//тут ниже ошибка связанное с делением это не имеет значение тут важно почему потоки работают без конечно и без ожиданий (метод запускается и сразу завершается без обработки строк)
[ThreadName]: 9[FULL_numdata]: 1566 [OT]: 1559[DO]: 1559[ITERASIYA]: 1
[ThreadName]: 9[FULL_numdata]: 1566 [OT]: 1559[DO]: 1559[ITERASIYA]: 156
[ThreadName]: 9[FULL_numdata]: 1566 [OT]: 1559[DO]: 1559[ITERASIYA]: 157
[ThreadName]: 9[FULL_numdata]: 1566 [OT]: 1559[DO]: 1559[ITERASIYA]: 624
[ThreadName]: 9[FULL_numdata]: 1566 [OT]: 1559[DO]: 1559[ITERASIYA]: 158
[ThreadName]: 9[FULL_numdata]: 1566 [OT]: 1559[DO]: 1559[ITERASIYA]: 1248
[ThreadName]: 9[FULL_numdata]: 1566 [OT]: 1559[DO]: 1559[ITERASIYA]: 1404
  • Каков размер списка? Какие именно строки? Приведите пример. Есть большая вероятность, что многопоточность не понадобится, если подобрать правильный компаратор. – Alexander Petrov Sep 30 '18 at 13:43
  • Зачем lock (threadArrayD)? Этот кусок кода тоже вызывается из нескольких потоков? – Alexander Petrov Sep 30 '18 at 13:44
  • список студентов с кафедрами курсами и датами рождения и годами поступления через делиметр ":" это не важно, многопоточность принципиально нужна а с методом сортировки проблем нет она не важна, списки разные от 1-2 тыс до сотни тысяч может быть, lock (threadArrayD) да ... – GeneratorSveta Sep 30 '18 at 13:51
  • lock (threadArrayD) там одновременно должен будет обрабатывать несколько списков с разными обьемами , это тоже не важно, важна тока многопоточность и на примере кода выше желательно.. – GeneratorSveta Sep 30 '18 at 13:58
  • Ещё раз: зачем лочится threadArrayD? Я не понимаю смысла этого лока. – Alexander Petrov Sep 30 '18 at 14:09
  • это не важно - это важно! Например, использование Ordinal компаратора ускоряет сортировку строк в несколько раз. – Alexander Petrov Sep 30 '18 at 14:10
  • понимаю я , но мне именно много поточность важна, просто с многопоточностью сталкиваюсь редко по этому по возможности принципиально пытаюсь через многопоточность реализовывать все что можно, просто для практики и опыта важно, нодеюсь теперь понятней ответил)... – GeneratorSveta Sep 30 '18 at 14:18
  • 1
    Если хотите сортировать многопоточно, используйте встроенный в стандартную библиотеку Parallel LINQ. numbers.AsParallel().Sort(). – Mark Shevchenko Sep 30 '18 at 14:27
  • про паралель тоже вкурсе спс, именно с thred нужно, суть вопроса пожалуйста читайте внимательней, в чем проблема может быть в моем коде выше? почему потоки не работают как должны? – GeneratorSveta Sep 30 '18 at 14:51
  • 1
    потоки не ожидают завершения друг друга в вашем коде нет ожидания завершения потоков. потоки странно работают - метод, что вы в них отправляете, вы не показали. подскажите в чем проблема тут - это threadArrayD[g] вызовится q раз. То есть каждый элемент в массиве threadArrayD перезапишется q раз. В купе с тем, что вы не ждете конца потока, странно, что ваш код вообще как то работает - вы просто создаете портянку потоков (potoky*potoky), про бОльшую часть из них вы вовсе забываете, про остальную просто не ждете. – tym32167 Sep 30 '18 at 15:01
  • 1
    Попробуйте начать от сюда, многие вопросы отпадут сами собой. А по вопросу, нужна синхронизация по обновляемым данным между потоками. Ключевое слово AsParallel – NewView Sep 30 '18 at 15:11
  • было бы отлично если бы кто не будь показал (ответил) на моем примере выше то что отписал tym32167, если не затруднит... – GeneratorSveta Sep 30 '18 at 17:08
  • 1
    Невозможно вам ответить, пока вы не привели больше информации. Не известно, что делает метод MyAction - используются ли в нем разделяемые ресурсы (что требует блокировки)? Непонятно, как у вас передается в этот метод информация о номерах строк, которые он должен обрабатывать: через внешние переменные otstroky/dostroky (ужас)? И т. д. – Alexander Petrov Oct 01 '18 at 05:07
  • 1). используются ли в нем разделяемые ресурсы (что требует блокировки)?= Да используются. 2). Непонятно, как у вас передается в этот метод информация о номерах строк, которые он должен обрабатывать: через внешние переменные otstroky/dostroky (ужас)?= да через внешние переменные передаются (Но по сути то передача идет нормально вроде как ), проблема тока в задержке тут не? приведите пожалуйста ваш пример ответом на основе моего кода как лучше решить реализовать по вашему? – GeneratorSveta Oct 01 '18 at 06:31
  • Никто к вам ничего не ответит, так как 1) не видно как вы сами пробовали решить ваши проблемы, 2) метод, что вы запускаете параллельно вы так и не показали - потому тут отвечать, по сути, не на что – tym32167 Oct 01 '18 at 07:36
  • 1
    Чтобы вам помочь, нам нужен ваш метод MyAction, | Нельзя использовать передачу параметров в потоки так, как вы делаете сейчас: через внешние переменные otstroky/dostroky. Представьте: запустили один поток со значениями 1 и 10, он начал работу; потом запустился другой поток со значениями 11 и 20 - эти же самые значения теперь использует и первый поток, потому что переменные те же самые. – Alexander Petrov Oct 07 '18 at 08:47

0 Answers0