Russian Qt Forum

Qt => Многопоточное программирование, процессы => Тема начата: __Heaven__ от Октябрь 14, 2014, 15:27



Название: Вопросы по многопоточности
Отправлено: __Heaven__ от Октябрь 14, 2014, 15:27
Привет, друзья!
Решил затронуть тему решения задач с помощью многопоточности и столкнулся с некоторыми вопросами.
1) Если у меня производится чтение большого текстового файла, имеет ли смысл раздельть потоки на чтение и парсинг?
2) Имеется большое количество данных, которое необходимо обработать по одному и тому же алгоритму, предположим проверка на >0 с последующим внесением таких чисел в вектор. Что лучше использовать при работе с 4 потоками: QAtomicInteger или разделить массив на 4 части и передать каждому потоку?


Название: Re: Вопросы по многопоточности
Отправлено: dmitriym от Октябрь 14, 2014, 15:30
1) Если возможно начать парсить до того, как считался весь файл, то возможно имеет
2) Лучше тот алгоритм, где потоки не соревнуются как ресурсы. Делить на 4 части


Название: Re: Вопросы по многопоточности
Отправлено: __Heaven__ от Октябрь 14, 2014, 15:38
1) Если возможно начать парсить до того, как считался весь файл, то возможно имеет
2) Лучше тот алгоритм, где потоки не соревнуются как ресурсы. Делить на 4 части

2) что если у меня свободно только 1 ядро на момент выполнения? получается, что 3 остальных потока будут долго обрабатываться? Или же они будут перекидываться на свободное ядро по очереди?


Название: Re: Вопросы по многопоточности
Отправлено: dmitriym от Октябрь 14, 2014, 16:10
https://ru.wikipedia.org/wiki/%D0%92%D1%8B%D1%82%D0%B5%D1%81%D0%BD%D1%8F%D1%8E%D1%89%D0%B0%D1%8F_%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%BD%D0%BE%D1%81%D1%82%D1%8C


Название: Re: Вопросы по многопоточности
Отправлено: dmitriym от Октябрь 14, 2014, 16:12
http://www.dtf.ru/articles/read.php?id=39888&page=2


Название: Re: Вопросы по многопоточности
Отправлено: __Heaven__ от Октябрь 14, 2014, 16:24
Все равно пока не понимаю, каким образом будет выполняться переключение потоков.
Допустим, есть 4 ядра в ОС Win. На 3 из них идет расчёт в сторонней программе - загруженность 100%. Моя программа запускает 4 потока с интенсивными вычислениями.
Могут ли потоки прыгать между ядрами?


Название: Re: Вопросы по многопоточности
Отправлено: Igors от Октябрь 14, 2014, 16:44
1) Если у меня производится чтение большого текстового файла, имеет ли смысл раздельть потоки на чтение и парсинг?
Практически нет.

2) Имеется большое количество данных, которое необходимо обработать по одному и тому же алгоритму, предположим проверка на >0 с последующим внесением таких чисел в вектор. Что лучше использовать при работе с 4 потоками: QAtomicInteger или разделить массив на 4 части и передать каждому потоку?
Здесь упирается в "предположим". Если это такое действие как > 0, то "выйгрыш" очень мал (если вообще есть), игра не стоит свеч.

ОС сам распределяет нагрузку, Вас не должно волновать какое ядро свободно и какие задачи еще выполняются. Потоки всегдв прыгают между ядрами, чтобы закрепить поток за ядром надо сильно постараться (и то не на всех ОС). Важно чтобы "кластер" (то что поручается 1 нитке) был достаточно велик, дать нитке следующую задачу всегда достаточно накладно, поэтому при малых задачах получается "пройгрыш" - все уходит в переключения