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