Задать вопрос
@csar
c++

Алгоритм многопоточности?

Имеется программа, обходящая все диски, и при нахождении определенных типов создает хеш файла. Хочу реализовать многопоточность для ускорения программы. Как правильно это сделать?
Создавать отдельный поток для каждого найденного файла? Т.е. на псевдоязыке
if(Filefound)
   new_thread(gethash(file))

не вариант, т.к. загрузит проц.
Интересует алгоритм, на любом языке. Можно псевдо.
Спасибо.
  • Вопрос задан
  • 724 просмотра
Подписаться 1 Оценить 1 комментарий
Решения вопроса 2
@nirvimel
Не надо создавать отдельный поток для каждого файла. Создайте два пула потоков.

Пул №1 (вычислительный): количество потоков равно количеству ядер CPU. Во входную очередь сыплются блоки данных, для которых потоки пула рассчитывают хеши.

Пул №2 (синхронное чтение с диска): количество потоков равно количеству ядер, помноженному на некоторую константу (в исходниках разных библиотек я видел значения от 2 до 10). Во входную очередь сыплются имена файлов, которые потоки пула открывают, читают и засылают прочитанные блоки во входную очередь пула №1.
Примечание: расход памяти регулируется ограничением максимальной длинны входной очереди пула № 1. Практически получается, что пул №1 ограничивает нагрузку на пул №2, который в норме недонагружен.

Отдельный поток, который совершает обход дерева каталогов и засылает найденные имена файлов во входную очередь пула №2. Длину этой очереди, тоже можно ограничить, но не так жестко (я бы задал размер в несколько сотен).

P.S.: Все очереди с ограничением длины должны быть, конечно же, с блокировками (не lock-free), так как через них происходит регулировка нагрузки (иначе все потоки нагрузятся на 100%).
Размер блоков данных, поступающих на вход пула №1 не надо делать слишком маленьким (я бы задал 64 килобайта, например).
Ответ написан
Комментировать
devalone
@devalone
̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻
Для каждого файла это явно перебор. Создавайте тред пул https://toster.ru/q/433618?e=5386209#answer_item_1...
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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