![]() |
PIP 5.6.1
Platform-Independent Primitives
|
Вспомогательный класс, который выполняет один целочисленный диапазон на фиксированном наборе рабочих потоков. Подробнее...
#include <pithreadpoolloop.h>
Открытые члены | |
| PIThreadPoolLoop (int thread_cnt=-1) | |
| Создает исполнитель параллельного цикла с thread_cnt рабочими потоками. Если thread_cnt меньше либо равен нулю, используется количество процессоров. | |
| virtual | ~PIThreadPoolLoop () |
| Останавливает рабочие потоки и уничтожает исполнитель цикла. | |
| void | setFunction (std::function< void(int)> f) |
| Устанавливает тело итерации, которое вызывается один раз для каждого индекса запущенного диапазона. | |
| void | wait () |
| Ожидает завершения текущего запущенного пакета, начатого через start(). | |
| void | start (int index_start, int index_count) |
| Запускает асинхронное выполнение для индексов из диапазона [index_start, index_start + index_count). | |
| void | exec (int index_start, int index_count) |
| Выполняет настроенное тело итерации для индексов из диапазона [index_start, index_start + index_count) и ожидает завершения. | |
| void | exec (int index_start, int index_count, std::function< void(int)> f) |
| Устанавливает тело итерации f, выполняет его для индексов из диапазона [index_start, index_start + index_count) и ожидает завершения. | |
Вспомогательный класс, который выполняет один целочисленный диапазон на фиксированном наборе рабочих потоков.
Пул потоков
Этот класс позволяет распараллелить цикл
Этот класс предназначен для распараллеливания цикла "for(;;)" максимально простым способом. В конструкторе создается несколько потоков, затем методом setFunction() устанавливается функция, представляющая собой тело цикла. Затем вызовом start() или exec() цикл исполняется параллельно. Каждый поток получает значение переменной цикла и вызывает функцию-тело до тех пор, пока весь диапазон не будет исполнен.
Пример:
Эквивалентно:
В силу многопоточности очень важно защитить выходные данные тела цикла с помощью блокировок (мьютекса). Также стоит помнить, что последовательность выполнения неопределена, и не стоит использовать глобальных переменных в теле цикла. Используйте локальные переменные и захват в лямбде.