| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Общие вопросы по .NET и C# > Создание множества потоков |
| Автор: Lex101 7.3.2011, 22:12 | ||
| Добрый вечер! Есть задача - многопоточные векторные вычисления. Есть 3 массива, в первых двух рандомные значения, а в третьем - результат их перемножения. Размерность массивов - ну скажем 100млн элементов. И всё это дело нужно разбивать на огромное количество поток, причём количество произвольное - от 500 до 600 допустим. Я создаю потоки в цикле, большинство выведенных мне элементов - нули. При дебагинге заметил, что при создании нового потока в цикле на следующей итерации, предыдущий поток умирает, так и не успев завершить все вычисления в заданном ему диапазоне. Очень прошу помощи!
|
| Автор: Lex101 8.3.2011, 00:59 |
| 1) А что такого в такой большой размерности? памяти сожрёт не мало, и всего-то. 2) Про практическое применение я не говорил, а сказал, что есть такая задача! 3) ну ошибся на чуток, не обработается один элемент, не страшно Поток помечен как остановленный Stopped - а не как спящий. Надеюсь бесполезных замечаний больше не будет, очень надеюсь на помощь в решении этой задачи! |
| Автор: Экскалупатор 8.3.2011, 01:37 | ||
| Lex101, ну ладно, не буду делать "бесполезных замечаний". по существу. я думаю все потому что у тебя в методе идет работа с одними и теми же данными, и потоки не могут их между собой поделить, потому что метод статический(т.е. один на все приложение) и данные тоже. для примера, если сделать метод Count не статическим, и убрать из него использование статических переменных, то он начинает выполняться оооооочень долго. для примера вот так:
при этом он долго и нудно(у меня минут 5) выводит числа в консоль не останавливаясь, потом пишет что поток завершился. это было по существу, надеюсь помог. остальное это архитектура. думаю поможет если выполнять потоки по очереди(тут лучше запускать в цикле один и тот же алгоритм, если уж так принципиально делать 500-600 итераций), или сделать что бы каждый поток обрабатывал свои данные). или нужно реализовать потокобезопасный способ доступа к данным. но это опять же личные наблюдения |
| Автор: Lex101 8.3.2011, 02:17 |
| Благодарю за советы! считает долго только из-за того, что выводит на консоль. А делать метод нестатическим - значит фигачить его в класс. Думаю стоит попробовать раскидать логику по классам. |
| Автор: Экскалупатор 8.3.2011, 02:43 |
| Lex101, думаю правильным будет сделать класс который работает с массивом. попытаюсь объяснить, в твоем случае у тебя массив открыт и его изменяют все кому не лень, отсюда проблемы. если обернуть массивы в класс который будет через какой то метод выполнять одно действие, то потоки не будут иметь доступ на прямую к массиву и не возникнет ситуации когда могут быть проблемы. при этом надо что бы в метод не могло попасть более двух потоков одновременно. оно же ничего не считает, просто работа распределяется "более-менее равномерно" между всеми создаваемыми потоками, по этому до окончания одно из потоков проходит долго времени, потому что они по сути не выполняются параллельно, у меня стоит двухядерный процессор, можно предположить что одновременно могут выполняться два потока, но вывод на консоль показывает что это не так, все же один поток всегда приоритетнее... |
| Автор: Lex101 8.3.2011, 12:20 |
| Колоссальное замедление при выводе в консоль связано только с отрисовкой самих элементов в консоли. |
| Автор: -Mikle- 8.3.2011, 14:21 |
| По своему опыту подтверждаю на все 100. Любые операции вывода (даже в консоль) всегда очень медленные. |
| Автор: Экскалупатор 8.3.2011, 14:37 |
| да тут не в том вопрос что медленно, я просто сказал что потоки не прекращают свою работу, и выводят информацию от начала и до конца. то что медленно это детали. просто у человека была проблема что потоки умирали, я показал что так они не умирают. а консоль не при чем |
| Автор: -Mikle- 9.3.2011, 18:54 |
| а, точно |